1. 程式人生 > >10-Synchronized:悲觀鎖,可重入鎖

10-Synchronized:悲觀鎖,可重入鎖

  1. Synchronized:悲觀鎖,可重入鎖
    1. 特點:可重入的鎖

可重入鎖,一個獲得的鎖的執行緒沒執行完可以繼續獲得該鎖。

執行緒佔用鎖的時候,如果執行的同步程式碼出現異常,會自動將鎖讓出。

同步程式碼塊的程式碼是同步執行的(一次執行完),而非同步程式碼塊的程式碼可以非同步執行。

要求鎖的獲取和釋放存在同一個塊結構中;當獲取了多個鎖時,它們必須以相反的順序釋放

    1. 使用注意事項:區分鎖物件(鎖不同沒有互斥作用)

分類

具體分類

當前鎖物件

虛擬碼

同步

方法

例項方法

當前例項物件

public synchronized void myMethod(){...}

靜態方法

類物件

public static synchronized void myMethod(){...}

例項物件

當前例項物件

synchronized(this){...}

Class物件

類物件

synchronized(MyClass.class){...}

Object物件

例項物件obj

synchronized(obj){...}

 

    1. 原理:

Synchronized用於鎖住當前的物件。當執行到被synchronized修飾的程式碼時,需先獲取當前的鎖物件。獲取失敗,則進入阻塞佇列中等待;獲取成功則執行程式碼,執行完成後釋放鎖物件,並通知阻塞佇列。

    1. synchronized的happens-before關係:先加鎖後釋放鎖
    2. JMM中的記憶體可見性

鎖獲取成功時,從主存讀取共享變數到本地記憶體中;釋放鎖成功時,強制重新整理本地記憶體資料到主存中。

    1. Synchronized優化

使用的是悲觀鎖的策略,即同一時間只能有一個執行緒去獲得鎖。而CAS是樂觀鎖的策略,