在java中,對(duì)很多常見的需要加鎖的操作進(jìn)行了封裝,例如Atomic開頭的一些類傻唾,這些類是線程安全的,但是內(nèi)部卻不是用synchronized加鎖實(shí)現(xiàn)承耿,而是CAS冠骄。cas是compare and set的縮寫。
CAS操作會(huì)有ABA問題瘩绒,意思就是一個(gè)線程在操作的時(shí)候猴抹,另一個(gè)線程把數(shù)據(jù)修改了,然后又改了回去锁荔,單純比較值似乎沒有變化蟀给。
ABA問題對(duì)于基礎(chǔ)數(shù)據(jù)類型的數(shù)據(jù)其實(shí)沒有太大影響蝙砌,如果不是基礎(chǔ)類型,并且必須處理ABA問題跋理,可以考慮增加版本號(hào)管理择克,在compare的時(shí)候連版本號(hào)一起比較。
就像AtomicInteger類前普,如果要處理ABA問題可以考慮使用AtomicStampedReference類肚邢。
jdk中有很多使用CAS實(shí)現(xiàn)的鎖,例如ReentrantLock拭卿,ReenTrantLock相比synchronized更加靈活骡湖,不過從實(shí)現(xiàn)上來(lái)說可能稍微麻煩些,其中有一點(diǎn)就是需要手動(dòng)解鎖峻厚;
ReentrantLock比較靈活靈活响蕴,是因?yàn)樗梢员淮驍啵褂胠ockInterruptibly()惠桃,在創(chuàng)建lock對(duì)象的時(shí)候浦夷,還可以選擇使用公平鎖還是非公平鎖,默認(rèn)是非公平的辜王,如果要公平劈狐,則可以在后邊參數(shù)中傳true