今天就跟大家聊聊有關java中synchronized關鍵字怎么使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
說明:
java中的同步(synchronized)是基于進入monitor對象和退出monitor對象來實現的,無論是顯式同步還是隱式同步。
synchronized語句塊:
1)(使用javap -c 類名)將class文件反編譯后可以看到:同步塊的入口位置和出口位置(方法結束處和異常處)分別插入了monitorenter字節碼指令和monitorexit字節碼指令,故同步代碼塊屬于顯示同步。 2)線程執行到monitorenter指令時,嘗試獲取對象的鎖。
synchronized方法:
1)JVM從Class文件中的方法結構(method_info)中的 ACC_SYNCHRONIZED 訪問標志區分一個方法是否為同步方法,故同步方法屬于隱式同步。 2)當方法調用時,調用指令會檢查方法的ACC_SYNCHRONIZED訪問標志是否被設置,如果設置了,執行線程將先持有monitor,然后再執行方法,最后在方法完成時釋放monitor。 3)在方法執行期間,其它線程無法獲取該monitor。 4)如果一個同步方法執行期間拋出了異常,并且在方法內部無法處理此異常,那這個同步方法所持有的monitor將在異常拋到同步方法之外時自動釋放。 method_info 結構格式如下(java虛擬機規范中的摘錄): method_info { u2 access_flags; // 用于定義當前方法的訪問權限和基本屬性的標志 u2 name_index; u2 descriptor_index; u2 attributes_count; attribute_info attributes[attributes_count]; } method_info結構中訪問標記(access_flags)的取值: 標記名 值 說明 ACC_PUBLIC 0x0001 public,方法可以從包外訪問 ACC_PRIVATE 0x0002 private,方法只能本類中訪問 ACC_PROTECTED 0x0004 protected,方法在自身和子類可以訪問 ACC_STATIC 0x0008 static,靜態方法 ACC_FINAL 0x0010 final,方法不能被重寫 ACC_SYNCHRONIZED 0x0020 synchronized,方法由monitor同步 ... 獲取鎖和釋放鎖的內存原語: 當線程獲取鎖時,JMM會把該線程對應的本地內存置為無效。從而使得被monitor保護的臨界區代碼必須從主內存中讀取共享變量。 當線程釋放鎖時,JMM會把該線程對應的本地內存中的共享變量刷新到主內存中 即: 1將本地內存中的數據設置為無效, 2從主內存中將數據復制到本地內存中, 3在本地內存中進行操作, 4操作完成后將本地內存中的數據刷新到主內存中。整體看起來就像是直接在主內存中操作一樣。 synchronized的可重入性: 1)當一個線程再次請求自己持有對象鎖的臨界資源時,這種情況屬于重入鎖,請求將會成功。 2)由于synchronized是基于monitor實現的,故每次重入,monitor中的計數器仍會加1。
看完上述內容,你們對java中synchronized關鍵字怎么使用有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。