線程安全:
多個線程訪問某個類,不管采用何種調(diào)度方式或這些進程如何交替執(zhí)行愚臀,在主調(diào)代碼中不需要采用同步或協(xié)同,都表現(xiàn)出正常的行為矾利,那么這個類是線程安全的類姑裂。
線程安全性:
原子性:提供互斥訪問,同一個時刻男旗,只能有一個線程來對它進行操作舶斧。
可見性:一個線程對主內(nèi)存的修改可以及時的被其他線程觀察到。
有序性:一個線程觀察其他線程中的指令執(zhí)行順序察皇,由于指令的重排序的存在茴厉,該觀察結(jié)果一般雜亂無序。
JUC ->ATOMIC什荣,LOCK
synchronized:依賴 JVM
Lock:依賴特殊的CPU指令矾缓,代碼實現(xiàn),ReentrantLock
原子性——synchronized
修飾代碼塊:大括號括起來的代碼溃睹,作用于調(diào)用對象
修飾方法:整個方法而账,作用于調(diào)用對象
修飾靜態(tài)方法:整個靜態(tài)方法,作用于所有對象
修飾類:括號括起來的部分因篇,作用于所有對象
對比:
synchronized:不可中斷鎖泞辐,適合競爭不激烈笔横,可讀性好。
lock:可中斷鎖咐吼,多樣化同步吹缔,競爭激烈是能維持常態(tài)。
atomic:競爭激烈時能維持常態(tài)锯茄,比lock性能好厢塘,只能同步一個值。
可見性:
導(dǎo)致共享變量再線程間不可見的原因
1.線程交叉執(zhí)行
2.重排序結(jié)合線程交叉執(zhí)行
3.共享變量更新后的值沒有在工作內(nèi)存與主存間及時更新
有序性:
java內(nèi)存模型中肌幽,允許編譯器和處理器對指令進行重排序晚碾,但是重排序不會影響單線程程序執(zhí)行,卻會影響多線程并發(fā)執(zhí)行的正確性喂急。(深入理解java虛擬機 【書】)
volatile,synchronized,lock