《java多線程編程核心技術(shù)》讀書(shū)筆記

最近讀完了《java多線程編程核心技術(shù)》(高洪巖)间雀、《Android高性能編程》(葉坤 譯)悔详、《Java RESTful Web Service實(shí)戰(zhàn) (第2版)》(韓陸),覺(jué)得有必要記錄下惹挟。先從《java多線程編程核心技術(shù)》開(kāi)始茄螃。
廢話不多說(shuō),上思維導(dǎo)圖


java多線程編程核心技術(shù).png

1连锯、線程常用方法

(1)繼承Thread归苍、實(shí)現(xiàn)Runnable接口
(2)共享數(shù)據(jù)可能會(huì)出現(xiàn)線程不安全問(wèn)題
(3)isAlive 判斷線程是否處于活動(dòng)狀態(tài)
(4)sleep 線程進(jìn)入休眠
(5)停止線程

this.interrupted()  測(cè)試當(dāng)前線程是否已經(jīng)是中斷狀態(tài),執(zhí)行后對(duì)狀態(tài)有清除為false的功能
this.isInterrupted() 測(cè)試線程Thread對(duì)象是否已經(jīng)是中斷狀態(tài)运怖,但不清除狀態(tài)標(biāo)志
可以通過(guò)Throw new Exception中斷線程運(yùn)行
stop方法已經(jīng)不建議繼續(xù)使用

(6)暫停拼弃、恢復(fù)線程
suspend、resume 該組方法有獨(dú)占摇展、不同步的缺點(diǎn)
yield放棄當(dāng)前占用的cpu資源吻氧,但暫停時(shí)間不確定
(7)線程可以設(shè)置優(yōu)先級(jí) 1~10的級(jí)別,默認(rèn)5咏连,最小1盯孙,最大10,小于1或者大于10都會(huì)拋異常

2捻勉、對(duì)象及變量的并發(fā)訪問(wèn)

synchronized保護(hù)的是對(duì)象

同步實(shí)例方法(同步當(dāng)前對(duì)象)
int count = 0;
public synchronized void add() {
  count++;
}

同步靜態(tài)方法(同步當(dāng)前類(lèi))
static int count = 0;
public static synchronized void add() {
  count++;
}

同步代碼塊
(實(shí)例镀梭,同步當(dāng)前對(duì)象)
int count = 0;
public void add() {
  synchronized(this) {
    count++;
  }
}
(靜態(tài)刀森,同步當(dāng)前類(lèi))
static int count = 0;
public static void add() {
  synchronized(Counter.class) {
    count++;
  }
} 
(使用單獨(dú)對(duì)象作為鎖)
int count = 0;
Object object = new Object();
public void add() {
  synchronized(object) {
    count++;
  }
}

可重入性/內(nèi)存可見(jiàn)性/死鎖
volatile 變量存在于線程外部的內(nèi)存空間踱启,能保證變量是最新值,只能保證可見(jiàn)性研底,不能保證原子性埠偿,就是說(shuō)不能保證變量的同步安全。

3榜晦、線程間通信

(1)等待/通知機(jī)制
wait方法是Object類(lèi)的方法冠蒋,必須要配合監(jiān)視器(synchronized)一起使用,監(jiān)視器監(jiān)視的是對(duì)象乾胶。

    public static void main(String[] args) {
        try {
            Object lock = new Object();
            ThreadA threadA = new ThreadA(lock);
            threadA.start();
            Thread.sleep(2000);
            
            ThreadB threadB = new ThreadB(lock);
            threadB.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static class ThreadA extends Thread {
        
        private Object lock;
        
        public ThreadA(Object lock) {
            this.lock = lock;
        }
        
        @Override
        public void run() {
            try {
                synchronized (lock) {
                    System.out.println("開(kāi)始  wait time:" + System.currentTimeMillis());
                    lock.wait();
                    System.out.println("結(jié)束  wait time:" + System.currentTimeMillis());
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    public static class ThreadB extends Thread {
        
        private Object lock;
        
        public ThreadB(Object lock) {
            this.lock = lock;
        }
        
        @Override
        public void run() {
            synchronized (lock) {
                System.out.println("開(kāi)始  notify time:" + System.currentTimeMillis());
                lock.notify();
                System.out.println("結(jié)束  notify time:" + System.currentTimeMillis());
            }
        }
    }

notifyAll 可以喚醒所有持有該對(duì)象鎖的線程抖剿,讓其繼續(xù)執(zhí)行剩余的操作朽寞。

(2)通過(guò)管道進(jìn)行線程間通信(字節(jié)流/字符流)
(3)join方法的使用

   public static void main(String[] args) {
       try {
           ThreadA thread = new ThreadA();
           thread.start();
           thread.join();
           System.out.println("我在Thread執(zhí)行完成后,執(zhí)行了這個(gè)log");
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       
   }
   
   private static class ThreadA extends Thread {
       @Override
       public void run() {
           try {
               int secondValue = (int)(Math.random() * 10000);
               System.out.println(secondValue);
               Thread.sleep(secondValue);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       }
   }

join 會(huì)釋放鎖斩郎,sleep 內(nèi)部用的是sychronized脑融,所以sleep不會(huì)釋放鎖。

(3)ThreadLocal 相關(guān)內(nèi)容
ThreadLocal解決的是每個(gè)線程綁定自己的值缩宜,就想一個(gè)線程安全的盒子保存這線程的數(shù)據(jù)肘迎。
InheritableThreadLocal 可以在子線程中取得副線程傳承下來(lái)的值。InheritableThreadLocal是ThreadLocal的子類(lèi)锻煌。

4妓布、Lock的使用

ReentrantLock類(lèi)從jdk1.5開(kāi)始進(jìn)行支持。除了可以實(shí)現(xiàn)synchronized的的同步鎖功能外宋梧,還可以實(shí)現(xiàn)嗅探鎖定匣沼、多路分支通知等功能。

(1)基本使用

private Lock lock = new ReentrantLock();
try {
  lock.lock();
  .............
} catch(InterruptedException e) {
  e.printStackTrace();
} finally {
  lock.unlock();
}

(2)Condition實(shí)現(xiàn)等待/通知
Object類(lèi)中的wait()相當(dāng)于Condition中的await();
Object類(lèi)中的wait(long timeout)相當(dāng)于Condition中的await(long time, TimeUnit unit);
Object類(lèi)中的notify()相當(dāng)于Condition中的signal();
Object類(lèi)中的notifyAll()相當(dāng)于Condition中的signalAll();

public static void main(String[] args) throws InterruptedException {
        // TODO Auto-generated method stub
        MyService myService = new MyService();
        ThreadA threadA = new ThreadA(myService);
        threadA.start();
        Thread.sleep(3000);
        myService.signal();
    }
    
    private static class MyService {
        
        private Lock lock = new ReentrantLock();
        private Condition condition = lock.newCondition();
        
        public void await() {
            try {
                lock.lock();
                System.out.println("await 時(shí)間為" + System.currentTimeMillis());
                condition.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
        
        public void signal() {
            try {
                lock.lock();
                System.out.println("signal 時(shí)間為" + System.currentTimeMillis());
                condition.signal();
            } finally {
                lock.unlock();
            }
        }
    }
    
    private static class ThreadA extends Thread {
        
        private MyService myService;
        
        public ThreadA(MyService myService) {
            this.myService = myService;
        }
        
        @Override
        public void run() {
            // TODO Auto-generated method stub
            myService.await();
        }
        
    }

(3)公平鎖 非公平鎖
公平鎖先來(lái)先獲得鎖捂龄;非公平鎖先來(lái)不一定會(huì)獲得鎖肛著,有可能會(huì)導(dǎo)致一些線程一直沒(méi)獲得鎖。
Lock lock = new ReentrantLock(boolean isFair);

(4)各種方法
getHoldCount()跺讯、 getQueueLength()枢贿、getWaitQueueLength()
hasQueueThread()、hasQueueThreads()刀脏、hasWaiters()
isFair()局荚、isHeldByCurrentThread()、isLocked()
lockInterruptibly()愈污、tryLock()耀态、tryLock(long timeout, TimeUnit unit)
awaitUninterruptibly()、awaitUntil()

(5)ReentrantReadWriteLock讀寫(xiě)鎖
有兩個(gè)鎖暂雹,一個(gè)讀鎖首装,一個(gè)寫(xiě)鎖
多個(gè)讀鎖之間不互斥,讀鎖與寫(xiě)鎖互斥杭跪,寫(xiě)鎖與寫(xiě)鎖互斥

O了仙逻。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市涧尿,隨后出現(xiàn)的幾起案子系奉,更是在濱河造成了極大的恐慌,老刑警劉巖姑廉,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缺亮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡桥言,警方通過(guò)查閱死者的電腦和手機(jī)萌踱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)葵礼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人并鸵,你說(shuō)我怎么就攤上這事章咧。” “怎么了能真?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵赁严,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我粉铐,道長(zhǎng)疼约,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任蝙泼,我火速辦了婚禮程剥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘汤踏。我一直安慰自己织鲸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布溪胶。 她就那樣靜靜地躺著搂擦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哗脖。 梳的紋絲不亂的頭發(fā)上瀑踢,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音才避,去河邊找鬼橱夭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛桑逝,可吹牛的內(nèi)容都是我干的棘劣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼楞遏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼茬暇!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起橱健,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤而钞,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后拘荡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撬陵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年珊皿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了网缝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蟋定,死狀恐怖粉臊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情驶兜,我是刑警寧澤扼仲,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站抄淑,受9級(jí)特大地震影響屠凶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肆资,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一矗愧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧郑原,春花似錦唉韭、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至酸役,卻和暖如春春塌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背簇捍。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工只壳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人暑塑。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓吼句,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親事格。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惕艳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354