Java多線程筆記

1.sleep\wait\yield

  • yiled是讓步,會使當(dāng)前線程由運(yùn)行狀態(tài)進(jìn)入到就緒狀態(tài)稠曼,讓其他優(yōu)先級高線程先執(zhí)行形病,但是如果是同一優(yōu)先級的線程,那么誰先執(zhí)行就不確定了.它不會釋放鎖霞幅。
  • wailt等待漠吻,會使當(dāng)前線程進(jìn)入阻塞狀態(tài),并且會釋放鎖蝗岖。
  • sleep休眠侥猩,會使當(dāng)前線程進(jìn)入休眠阻塞狀態(tài),但不會釋放鎖抵赢。
public class SleepLockTest{ 
private static Object obj = new Object();
public static void main(String[] args){ 
    ThreadA t1 = new ThreadA("t1"); 
    ThreadA t2 = new ThreadA("t2"); 
    t1.start(); 
    t2.start();
} 

static class ThreadA extends Thread{
    public ThreadA(String name){ 
        super(name); 
    } 
    public void run(){ 
        // 獲取obj對象的同步鎖
        synchronized (obj) {
            try {
                for(int i=0; i <10; i++){ 
                    System.out.printf("%s: %d\n", this.getName(), i); 
                    // i能被4整除時欺劳,休眠100毫秒
                    if (i%4 == 0)
                        Thread.sleep(100);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    } 
  } 
}

2.守護(hù)線程

1.Java分為兩種線程:用戶線程和守護(hù)線程。
所謂守護(hù)線程是指在程序運(yùn)行的時候在后臺提供一種通用服務(wù)的線程铅鲤,比如垃圾回收線程就是一個很稱職的守護(hù)者划提。
這種線程并不屬于程序中不可或缺的部分,因此邢享,當(dāng)所有的非守護(hù)線程結(jié)束時鹏往,程序也就終止了,同時會殺死進(jìn)程中的所有守護(hù)線程骇塘。反過來說伊履,只要任何非守護(hù)線程還在運(yùn)行,程序就不會終止款违。
2.用戶線程和守護(hù)線程區(qū)別:
如果用戶線程已經(jīng)全部退出運(yùn)行了唐瀑,只剩下守護(hù)線程存在了,虛擬機(jī)也就退出了插爹。 因為沒有了被守護(hù)者哄辣,守護(hù)線程也就沒有工作可做了请梢,也就沒有繼續(xù)運(yùn)行程序的必要了。
3.代碼實現(xiàn)及注意事項
(1) thread.setDaemon(true)必須在thread.start()之前設(shè)置力穗,否則會跑出一個IllegalThreadStateException異常毅弧。你不能把正在運(yùn)行的常規(guī)線程設(shè)置為守護(hù)線程。
(2) 在Daemon線程中產(chǎn)生的新線程也是Daemon的当窗。
(3) 守護(hù)線程應(yīng)該永遠(yuǎn)不去訪問固有資源够坐,如文件、數(shù)據(jù)庫超全,因為它會在任何時候甚至在一個操作的中間發(fā)生中斷咆霜。

3.鎖機(jī)制

  • 可重入鎖,用于實現(xiàn)同步機(jī)制。

    private Lock lock = new ReentrantLock();
    function(){
       lock.lock();
       try{...}
      finally{
            lock.unlock();
        }
    }
    
  • 鎖的條件

    private Condition c = lock.newCondition();
    方法(){
        while(!(ok to operate)){
              c.await();
        }
        ...
        c.signalAll();
    }
    
  • 鎖和條件的注意事項
    1.鎖用來保護(hù)代碼片段,任何時刻只能有一個線程執(zhí)行被保護(hù)的代碼.
    2.鎖可以管理試圖進(jìn)入被保護(hù)代碼段的線程.
    3.鎖可以擁有一個或多個相關(guān)的條件對象
    4.每個條件對象管理那些已經(jīng)進(jìn)入被保護(hù)代碼段但還不能運(yùn)行的線程.

上述操作還可以用synchronized關(guān)鍵字和wait/notifyAll方法來完成嘶朱。
synchronized <==> lock+unlock
wait/notifyAll <==> c.await/c.signalAll

4.Lock/Condition 和 同步方法的取舍

  • 最好都不用蛾坯,采用java.util.concurrent包里面提供的機(jī)制,它會為你處理所有的加鎖疏遏,例如阻塞隊列脉课。
  • synchronized可以減少代碼編寫數(shù)量和出錯幾率。
  • 需要Lock/Condition的獨(dú)有特性時才使用财异。

5.yield和join

1.yield

  • yield是一個靜態(tài)的原生(native)方法
  • yield告訴當(dāng)前正在執(zhí)行的線程把運(yùn)行機(jī)會交給線程池中擁有相同優(yōu)先級的線程倘零。
  • yield不能保證使得當(dāng)前正在運(yùn)行的線程迅速轉(zhuǎn)換到可運(yùn)行的狀態(tài)
  • 它僅能使一個線程從運(yùn)行狀態(tài)轉(zhuǎn)到可運(yùn)行狀態(tài),而不是等待或阻塞狀態(tài)

2.join
線程實例的方法join()方法可以使得一個線程在另一個線程結(jié)束后再執(zhí)行戳寸。如果join()方法在一個線程實例上調(diào)用呈驶,當(dāng)前運(yùn)行著的線程將阻塞直到這個線程實例完成了執(zhí)行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疫鹊,一起剝皮案震驚了整個濱河市袖瞻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拆吆,老刑警劉巖聋迎,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異枣耀,居然都是意外死亡霉晕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門捞奕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牺堰,“玉大人,你說我怎么就攤上這事颅围∶妊妫” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵谷浅,是天一觀的道長。 經(jīng)常有香客問我,道長一疯,這世上最難降的妖魔是什么撼玄? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮墩邀,結(jié)果婚禮上掌猛,老公的妹妹穿的比我還像新娘。我一直安慰自己眉睹,他們只是感情好荔茬,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著竹海,像睡著了一般慕蔚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上斋配,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天孔飒,我揣著相機(jī)與錄音,去河邊找鬼艰争。 笑死坏瞄,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的甩卓。 我是一名探鬼主播鸠匀,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逾柿!你這毒婦竟也來了缀棍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鹿寻,失蹤者是張志新(化名)和其女友劉穎睦柴,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毡熏,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坦敌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了痢法。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狱窘。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖财搁,靈堂內(nèi)的尸體忽然破棺而出蘸炸,到底是詐尸還是另有隱情,我是刑警寧澤尖奔,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布搭儒,位于F島的核電站穷当,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏淹禾。R本人自食惡果不足惜馁菜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铃岔。 院中可真熱鬧汪疮,春花似錦、人聲如沸毁习。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纺且。三九已至盏道,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間隆檀,已是汗流浹背摇天。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留恐仑,地道東北人泉坐。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像裳仆,于是被迫代替她去往敵國和親腕让。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354