1.概述
編寫線程安全的代碼其核心點(diǎn)在于對(duì)于狀態(tài)訪問操作進(jìn)行管理攘乒,特別是對(duì)于共享的柒莉、可變的狀態(tài)的訪問
2.線程安全性
當(dāng)多個(gè)線程訪問一個(gè)類時(shí)祭隔,不管運(yùn)行環(huán)境采用何種調(diào)度方式或者多個(gè)線程之間以何種時(shí)許來進(jìn)行交替執(zhí)行压储,并且在主調(diào)代碼中不需要采用任何協(xié)同和同步機(jī)制德频,這個(gè)類都能表現(xiàn)出正確的行為苍息,那么這個(gè)類就行線程安全的
無狀態(tài)的類一定是線程安全的
3.竟態(tài)條件
當(dāng)某個(gè)計(jì)算的正確性取決于多個(gè)線程交替執(zhí)行的時(shí)許時(shí),那么就會(huì)發(fā)生竟態(tài)條件
對(duì)于一個(gè)或者一組變量的操作(讀和寫)必須保證原子性才能有效的避免竟態(tài)條件
4.Java內(nèi)置鎖-synchronized
- synchronized保證了被鎖住部分執(zhí)行時(shí)的原子性
- synchronized鎖是以鎖住的對(duì)象為一個(gè)鎖粒度抱婉,即JVM在識(shí)別鎖時(shí)是以鎖住的對(duì)象為維度類確認(rèn)是否是同一把鎖
- synchronized是可重入的档叔,重入的粒度為
線程
,而不是調(diào)用
- 內(nèi)置鎖的可重入保證了子類中同步方法引用父類的同步方法時(shí)蒸绩,可以有效的獲取鎖衙四,且不會(huì)發(fā)生死鎖的情況。此時(shí)獲取到的鎖鎖住的是子類對(duì)象
- 當(dāng)獲取與對(duì)象關(guān)聯(lián)的鎖時(shí)患亿,線程在獲取對(duì)象的鎖后五督,只能阻止其他線程獲取鎖,并不能阻止其他線程訪問此對(duì)象
5.活躍性與性能
安全性一定是第一位的祭阀,在保證線程安全的前提下傻工,可以將鎖的粒度盡量細(xì)化,以提高程序性能(當(dāng)然這并不是絕對(duì)的咙冗,比如一種情況沾歪,在大量的for循環(huán)中,一定要在for循環(huán)外面獲取鎖雾消,而不是每次循環(huán)中獲取鎖灾搏,這種稱之為鎖膨脹)
當(dāng)執(zhí)行時(shí)間較長(zhǎng)的計(jì)算或者無法快速完成的操作時(shí)(如王磊I/O或者控制臺(tái)I/O)挫望,一定不要持有鎖