Java併發——同步臨界區的訪問:synchronized關鍵字

1.臨界區:

臨界區就是必須以串行方式(一次一條線程)方法的一段代碼塊。

同步是通過監聽器來實現的。每一個Java對象都和一個監聽器相關聯,線程通過獲取和釋放監聽器的鎖來上鎖和解鎖。

2. 使用synchronized關鍵字來串行線程對方法和代碼塊(臨界區)的訪問

Synchronized能夠實現原子性和可見性;在Java內存模型中,synchronized規定,線程在加鎖時,先清空工作內存→在主內存中拷貝最新變量的副本到工作內存→執行完代碼→將更改後的共享變量的值刷新到主內存中→釋放互斥鎖。

(1)同步方法

1)當同步在實例方法上,鎖會和調用該方法的實例對象關聯

public class ID
{
    private int counter;
    public synchronized int getID()
    {
        return counter++;
    }
}

主程序中使用以下代碼

ID id = new ID( );

System.out.println(id.getID( ));

鎖和ID對象id相關聯。如果其他線程在該方法執行過程中調用id.getID()方法,這些線程不得不等待正在執行的線程釋放鎖。

2)當同步在類方法上時,鎖會和調用該方法的類所對應的java.lang.Class對象相關聯。

public class ID
{
    private static int counter;
    public static synchronized int getID()
    {
        return counter++;
    }
}

主程序中使用以下代碼

System.out.println(ID.getID( ));

鎖和ID類關聯的Class對象ID.Class相關聯。

 

(2)使用同步塊

synchronized(object)
{
   //代碼行
   ......
}

鎖和對象object相關聯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章