日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java中 synchronized 关键字的理解

發布時間:2024/9/30 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中 synchronized 关键字的理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

synchronized 關鍵字的理解

在Java中,synchronized 是一個重量級的控制并發的關鍵字。

這個關鍵字可以保證并發過程所必須的“原子性”,“可見性”,“有序性”

一,用法:

在方法內加鎖:

synchronized 塊在代碼編譯后生成的字節碼中實際上是加上monitorenter 和monitorexit。

//對當前的this對象加鎖,和synchronized成員方法是一樣的,和synchronized成員方法會互斥,同一時間只能有一個進入。 synchronized (this) {} //對TestUtil類對象加鎖,和靜態synchronized方法是一樣的,和synchronized靜態方法會互斥,同一時間只能有一個進入。 synchronized (TestUtil.class) {} //對infoVO對象加鎖,對某個對象加鎖,如果有其他操作這個對象的鎖方法,會互斥。 synchronized (infoVO){}

在方法上加鎖:

synchronized 方法則是在方法的【flags:】標志上多一個 ACC_SYNCHRONIZED

//對該類的靜態方法加鎖,多個線程調用同一個類的synchronized靜態方法時同一時間只能有一個進入(如果有多個靜態方法都是synchronized,也是同一時間只能有一個進入,因為鎖針對的是類)。 public synchronized static void staticMethod() { }//對當前對象的這個成員方法加鎖,多個線程調用同一個對象的synchronized成員方法時同一時間只能有一個進入。(如果有多個成員方法都是synchronized,也是同一時間只能有一個進入,因為鎖針對的是對象) public synchronized void simpleMethod() { }

二,分類

從上面可以看出,synchronized 的加鎖分為兩類

  • 對對象的鎖
  • 對類的鎖

三,鎖的優化

synchronized鎖是JAVA內置的,jdk對其一直持續優化。

對象頭的結構

  • 自旋鎖

因為java線程映射到內核進程,頻繁的線程掛起喚醒對性能造成的影響非常大,所以在jdk1.5之后加入了自旋鎖,在等待時間稍短的時候會進行自旋等待,但是自旋會造成cpu的損耗,如果長時間持續自旋仍然拿不到鎖,其實對性能反而是種損耗。

使用-XX:+UseSpining開啟。自旋次數使用-XX:+PreBlockSpin來更改。

  • 輕量級鎖

輕量級鎖是當請求時,當一個線程來請求鎖時,如果同步對象沒有被鎖定,虛擬機首先將在當前線程的棧幀中建立一個名叫鎖記錄的空間,用于存儲鎖對象目前Mark Word的拷貝,然后將對象的Mark Word 更新為這個指針。

如果成功,則獲取到了鎖,并且對象的MARK Word的鎖標志轉變為00,變為輕量級鎖。如果失敗,則判斷對象的Mark Word是否已經指向了當前線程的棧幀,如果有則說明已經獲取到了鎖,正常執行,如果沒有,則說明其他線程獲取到了這個鎖。

如果有兩個以上的線程用同一個鎖,則輕量級鎖會失效,直接膨脹變成重量級鎖。標志位變為10

使用了CAS交換Mark Word和棧幀來加鎖和解鎖

  • 偏向鎖

偏向鎖的偏就是偏心的偏,偏向鎖會偏向于第一個獲得鎖的線程,當第一個線程獲取到了鎖之后,虛擬機把對象頭標志位設為01,偏向模式。用cas操作把線程ID記錄在Mark Word中,如果CAS成功,則后續持有偏向鎖的這個線程進入時不再需要做任何操作。

而當有另一個線程去嘗試獲取鎖時,則偏向模式結束,撤銷偏向恢復到未鎖定01或者輕量級鎖00。

使用-XX:+UseBisedLocking 來啟用。

  • 偏向鎖和輕量級鎖區別

輕量級鎖是認為沒有競爭,每個線程來的時候不需要阻塞,直接可以通過CAS操作來進行對象鎖的更改;而偏向鎖則認為鎖不會被不同的線程獲取(永遠只被一個線程使用),所以更暴力,直接連CAS都不做,是這個線程則直接執行,不是這個線程則鎖膨脹。

  • 重量級鎖

在上面的鎖的優化都無法解決時,鎖會膨脹成重量級鎖,重量級鎖通過對象內部的監視器(monitor)實現,其中monitor的本質是依賴于底層操作系統的Mutex Lock實現,操作系統實現線程之間的切換需要從用戶態到內核態的切換,切換成本非常高。

總結

以上是生活随笔為你收集整理的Java中 synchronized 关键字的理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。