JAVA鎖機(jī)制

鎖提供了兩種主要特性:互斥(mutual exclusion) 和可見性(visibility).可見性就是釋放鎖之前的共享數(shù)據(jù)更改對隨后獲得鎖的線程是可見的。

1 Synchronized

使用:synchronized可加在方法上,也可加在特定代碼塊上,括號中表示需要鎖的獨(dú)享
性能:托管給JVM執(zhí)行,Java1.6后性能提升到與Lock差不多,官方更提倡使用。
場景:普通場景推薦使用。

2 Lock

使用:通常使用ReentrantLock重入鎖,顯示指定起始位置和終止位置。加鎖和解鎖處使用lock()unlock()方法,一般在finally塊中寫unlock()防止死鎖。
性能:用JAVA寫的控制鎖代碼
場景:復(fù)雜同步應(yīng)用推薦自定義使用。比如中斷線程控制權(quán),自定義wait-nitify線程,公平鎖等。
實(shí)現(xiàn):Lock接口的實(shí)現(xiàn)基本都是通過聚合了一個(gè)隊(duì)列同步器的子類來完成線程訪問控制的。
區(qū)別:ReentantLock表現(xiàn)為API層面的互斥鎖,synchronized表現(xiàn)為原生語法層面的互斥鎖。
優(yōu)點(diǎn):Lock提供了synchronized關(guān)鍵字不具備的主要特性:
1.嘗試非阻塞地獲取鎖;
2.能被中斷地獲取鎖;
3.超時(shí)獲取鎖。

獨(dú)占鎖:同一時(shí)間只有一個(gè)線程獲取鎖。再有線程嘗試加鎖,將失敗。 例如reentrantLock
共享鎖:同一時(shí)間可以有多個(gè)線程獲取鎖。例如FutureTask

3 擴(kuò)展:volatile

3.1 解釋
volatile用在多線程,同步變量。線程為了提高效率,將某成員變量(如A)拷貝了一份(如B),線程中對A的訪問其實(shí)訪問的是B。只在某些動(dòng)作時(shí)才進(jìn)行A和B的同步。因此存在A和B不一致的情況。volatile就是用來避免這種情況的。volatile告訴jvm,它所修飾的變量不保留拷貝,直接訪問主內(nèi)存中的(也就是上面說的A)
volatile會告知程序任何對該變量的訪問均需要從共享內(nèi)存中獲取,而對它的改變必須同步刷新回共享內(nèi)存,它能保證所有線程對變量訪問的可見性。

3.2 volatile與sychronized區(qū)別
volatile是程度較輕的synchronized,具備可見性,不具備操作原子性。volatile只是在線程內(nèi)存和“主”內(nèi)存間同步某個(gè)變量的值,而synchronized通過鎖定和解鎖某個(gè)監(jiān)視器同步所有變量的值,確保多個(gè)線程在同一時(shí)刻,只能由一個(gè)線程處于方法或同步塊中,這保證了線程對變量訪問的可見性和排他性。

volatilesynchronized的使用和執(zhí)行成本更低,不會引起線程上下文的切換和調(diào)度。Volatile一般情況下不能代替sychronized,因?yàn)?code>volatile不能保證操作的原子性,即使只是i++,實(shí)際上也是由多個(gè)原子操作組成:read i; inc; write i,假如多個(gè)線程同時(shí)執(zhí)行i++,volatile只能保證他們操作的i是同一塊內(nèi)存,但依然可能出現(xiàn)寫入臟數(shù)據(jù)的情況。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,815評論 11 349
  • Java8張圖 11、字符串不變性 12、equals()方法、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,899評論 0 11
  • ----------------------------------------業(yè)精于勤荒于嬉,形成思?xì)в陔S---...
    郭之源閱讀 2,147評論 0 22
  • 下午看到ico這幾篇文章,又去一塊聽聽聽把貓叔的欄目聽了一遍,做了筆記,就當(dāng)今天的作業(yè)了。 ico從英文字面來解釋...
    陳緒峰閱讀 204評論 0 1
  • 春暖花開時(shí)也是最有朝氣之時(shí)。寒冷的季節(jié)漸漸遠(yuǎn)去,我們?nèi)蔽溲b整裝待發(fā)!昨天已經(jīng)結(jié)束新的一天已經(jīng)開始,早上繼續(xù)...
    鍩睿閱讀 150評論 0 0

友情鏈接更多精彩內(nèi)容