線程同步[解決線程安全問題]
解決線程安全問題
線程同步方式一:同步代碼
語法基本
synchronized (同步監(jiān)聽對(duì)象) {
可能引發(fā)線程安全問題的代碼
}
上面的結(jié)構(gòu)相當(dāng)于把{ }中的代碼捆綁成一個(gè)整體,線程只能夠一個(gè)一個(gè)的進(jìn)來,執(zhí)行完一個(gè),下一個(gè)才能進(jìn)來
語法特點(diǎn)
1. 上面的同步監(jiān)聽對(duì)象可以是任意的對(duì)象;
2. 保證所有的線程共享一個(gè)同步監(jiān)聽對(duì)象的;也就是保證被同步監(jiān)聽對(duì)象是被所有線程共享的。
3. 很多時(shí)候可以寫this,但是請(qǐng)先參照②,
4. 常用的方式:使用類的字節(jié)碼對(duì)象XXX.class
線程同步方式二:同步方法
1、就是在需要被同步的方法上面加關(guān)鍵字synchronized
2、加的位置:在返回值類型的前面
3、不需要也不能夠顯示的寫同步監(jiān)聽對(duì)象
4、如果是一個(gè)非static的方法,那么同步監(jiān)聽對(duì)象就是this;
5、如果是static修飾的方法,那么同步監(jiān)聽對(duì)象就是當(dāng)前方法所在的類的字節(jié)碼對(duì)象
線程同步方式三:鎖機(jī)制
1、學(xué)習(xí)方式(查找API文檔方式)鎖--Lock(API)接口 ?---XXX實(shí)現(xiàn)類??
2、結(jié)果:沒有同步到
3、原因:lock是一個(gè)實(shí)例變量,因此創(chuàng)建了3個(gè)TicketThread對(duì)象就有3個(gè)lock對(duì)象,沒有同步到
4、解決辦法:static lock ?; 或者使用實(shí)現(xiàn)的方式
線程通信與等待喚醒
線程之間的交流
如何實(shí)現(xiàn)

線程的生命周期
1、簡單來說就是從什么時(shí)候開始,到什么時(shí)候結(jié)束
2、線程的聲明周期分幾個(gè)階段:
① 創(chuàng)建 ?; ?例如 ?Thread ?t = new Thread();
② 就緒 ?; ?調(diào)用了start方法 ?t.start() ?---> 告訴CPU我準(zhǔn)備好了
③ 運(yùn)行 ?; ?獲得CPU的資源,開始執(zhí)行線程體中的代碼
④ 死亡 ?; ?有多種情況導(dǎo)致死亡,
???? (1) 例如線程體執(zhí)行完畢(自然老死);
????? (2) 非自然死亡(異常沒有處理好);
????? (3) 對(duì)象失去引用
????? (4) 對(duì)象被垃圾回收機(jī)制銷毀
3、注意點(diǎn):
① 休眠等操作可能導(dǎo)致正在運(yùn)行的線程阻塞],阻塞完了(sleep完了)進(jìn)入的是就緒狀態(tài)
相互一一直等待,出現(xiàn)死鎖!
② 一個(gè)線程死了就死了,不能夠死而復(fù)生