java并发编程与线程安全
2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
什么是線程安全
如果對象的狀態(tài)變量(對象的實例域、靜態(tài)域)具有可變性,那么當(dāng)該對象被多個線程共享時就的考慮線程安全性的問題,否則很可能出現(xiàn)與預(yù)期不同的結(jié)果。
線程安全是指:當(dāng)多個線程訪問某個類時,不管運行時環(huán)境采用何種調(diào)度方式或者這些線程如何交替執(zhí)行,該類始終能表現(xiàn)出正確的行為。
一個類是否線程安全的,取決于兩點:是否被多線程共享;狀態(tài)是否可變。單線程環(huán)境中不涉及變量共享,不會產(chǎn)生線程安全性問題。多線程環(huán)境中共享無狀態(tài)的對象和狀態(tài)不可變的對象也不會產(chǎn)生線程安全性問題。
原子性
對于計數(shù)器counter++這種由“ 讀取-修改-寫入 ”組合而成的操作,在執(zhí)行過程中必須當(dāng)做是一個整體不被分割,不能被打斷, 三個子操作要么完全都不執(zhí)行,要么三個按順序依次都執(zhí)行。
加鎖機制
解決線程安全問題的辦法就是使用加鎖這一同步機制。由于鎖能使其保護的代碼段以串行形式來訪問,相當(dāng)于讓線程以獨占的方式來訪問狀態(tài)變量,因此提供了很好的安全性。加鎖需要注意一下幾點:
1、A線程在獲得對象O的鎖S之后,B線程如果要獲取鎖 S 就必須等待A釋放鎖,但是B任然可以訪問對象O的其他未被S加鎖的方法(非同步方法 或者 用其他對象作為鎖的方法),因此對同一狀態(tài)變量(或者組合狀態(tài))的同步必須使用同一個對象作為鎖,否則任然會出現(xiàn)線程安全問題。
2、頻繁的獲取鎖和釋放鎖本身就很消耗性能,因此在加鎖時需要注意一下事項:
A)、只有被多線程同時訪問的可變數(shù)據(jù)才需要加鎖保所,為單線程或共享不可變數(shù)據(jù)而加鎖不僅毫無意義,而且耗了性能。
B)、盡量將不影響共享狀態(tài)且執(zhí)行時間較長的操作移到同步代碼塊之外, 使同步代碼塊的執(zhí)行時間縮短,也使正在等待的線程在拿到鎖之前先將這些操作執(zhí)行完,一旦拿到鎖就可以快速執(zhí)行完。
C)、同步代碼塊不應(yīng)拆解的過細,需要在安全性、簡單性和性能上進行權(quán)衡。
?
以上就是簡單介紹下java并發(fā)編程與線程安全,如有表述不當(dāng)敬請諒解!
轉(zhuǎn)載于:https://my.oschina.net/u/2600520/blog/604417
總結(jié)
以上是生活随笔為你收集整理的java并发编程与线程安全的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黑客攻破网站涂鸦特效(强烈建议看看)
- 下一篇: APNS 那些事!