關(guān)于線程同步(7種方式)
本文章部分內(nèi)容轉(zhuǎn)載于 "http://www.cnblogs.com/XHJT/p/3897440.html"
1?特殊域變量(volatile)實(shí)現(xiàn)線程同步 開銷比較小
緩存一致性原理
?JVM就會向處理器發(fā)送一條Lock前綴的指令,將這個(gè)變量所在緩存行的數(shù)據(jù)寫回到系統(tǒng)內(nèi)存,其他處理器 會先判斷所在的緩存行 內(nèi)存地址是否改變 ?如果已經(jīng)修改 會標(biāo)記為無效 ,等到其他處理器要對這個(gè)數(shù)據(jù)修改時(shí) ?會強(qiáng)制從系統(tǒng)內(nèi)存中讀取數(shù)據(jù)到緩存區(qū) 在執(zhí)行操作
2? synchronized關(guān)鍵字修飾的方法 和同步代碼? ? 重量級鎖 內(nèi)存開銷比較大
即有synchronized關(guān)鍵字修飾的語句塊
被該關(guān)鍵字修飾的語句塊會自動被加上內(nèi)置鎖,從而實(shí)現(xiàn)同步
代碼如:
synchronized(object){
}
注:同步是一種高開銷的操作,因此應(yīng)該盡量減少同步的內(nèi)容。
通常沒有必要同步整個(gè)方法,使用synchronized代碼塊同步關(guān)鍵代碼即可。
javaSE 1.6 的優(yōu)化
3 ?使用重入鎖實(shí)現(xiàn)線程同步? JavaSE 5.0
在JavaSE5.0中新增了一個(gè)java.util.concurrent包來支持同步。
ReentrantLock類是可重入、互斥、實(shí)現(xiàn)了Lock接口的鎖,
ReenreantLock類的常用方法有:
ReentrantLock() : 創(chuàng)建一個(gè)ReentrantLock實(shí)例
lock() : 獲得鎖
unlock() : 釋放鎖
4.使用局部變量實(shí)現(xiàn)線程同步
ThreadLocal() : 創(chuàng)建一個(gè)線程本地變量? TLS區(qū)? Android的Looper對象
5.使用阻塞隊(duì)列實(shí)現(xiàn)線程同步
?LinkedBlockingQueue?
6 使用原子變量實(shí)現(xiàn)線程同步?
原子操作就是讀取變量值、修改變量值、保存變量值看成一個(gè)整體來操作。即-這幾種行為要么同時(shí)完成,要么都不完成