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相關聯。