Java多線程學(xué)習(xí)筆記(持續(xù)更新)

1 線程安全的核心在于對(duì)狀態(tài)訪問(wèn)操作進(jìn)行管理,尤其是共享的和可變的,所以可變對(duì)象盡量寫在run方法內(nèi)部

2 synchronized/volatile/顯示鎖/原子變量?/transient

3 多個(gè)線程訪問(wèn)同一個(gè)可變狀態(tài)變量時(shí)沒(méi)有合適的同步,三種方式可以同步:

(1)不在線程之間共享該狀態(tài)變量

(2)將狀態(tài)變量改為不可變的變量,要么final,要么new一個(gè)新對(duì)象?即使對(duì)象里所有域都是final類型,對(duì)象仍然可變,因?yàn)閒inal類型的域中可以保存對(duì)可變對(duì)象的引用。final域能確保初始化過(guò)程的安全性,從而可以不受限制的訪問(wèn)不可變對(duì)象,并在共享這些對(duì)象時(shí)無(wú)須同步。

(3)在訪問(wèn)狀態(tài)變量時(shí)使用同步

4 無(wú)狀態(tài)對(duì)象一定是線程安全的,這里的狀態(tài)指類的變量

5 當(dāng)某個(gè)計(jì)算的正確性取決于多個(gè)線程的交替執(zhí)行時(shí)序時(shí),就會(huì)發(fā)生競(jìng)態(tài)條件,例如:延遲初始化

6 java.util.concurrent.atomic包包含了一些原子變量類,例如:通過(guò)用AtomicLong來(lái)代替long類型的計(jì)數(shù)器

7 要保持狀態(tài)的一致性,就要在單個(gè)原子操作中更新所有相關(guān)的狀態(tài)變量?

8 內(nèi)置鎖:@GuardBy("this")

9 當(dāng)計(jì)算時(shí)間較長(zhǎng),一定不要有鎖,例如:網(wǎng)絡(luò)IO或控制臺(tái)IO

10 對(duì)于非volatile類型的long和double變量,JVM允許將64位的讀寫操作分解為兩個(gè)32位的操作,所以讀寫操作在不同的線程里執(zhí)行,可能會(huì)讀到某個(gè)值的高32位和另一個(gè)值的低32位

11 volatile的典型用法:檢查某個(gè)某個(gè)狀態(tài)標(biāo)記以判斷是否退出循環(huán)??纱_保將變量的更新操作通知其他線程。加鎖機(jī)制可同時(shí)確保內(nèi)存可見(jiàn)性和原子性,而volatile只確??梢?jiàn)性。

12 this引用逸出?public getter方法會(huì)導(dǎo)致逸出?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容