鎖提供了倆種重要的特性:互斥和可見性
互斥即一次只允許一個線程持有某個特定的鎖,並且只能由持有該鎖的線程進行解鎖。因此可使用該特性實現對共享數據的協調訪問協議,這樣,一次就只有一個線程能夠使用該共享數據。保證了數據不會被其他線程“污染”。
可見性必須確保釋放鎖之前對共享數據做出的修改對於隨後獲得該鎖的另一個線程是可見的 。
Volatile關鍵字用來修飾變量。當一個變量被Volatile關鍵字修飾時,相當於告訴JVM,該變量的值是不確定的,須從主存讀取。當變量的值發生改變時,儘快通知其他線程。
Synchronized關鍵字用來修飾變量、方法、類等。保證了在同一時刻,只有一個線程執行加鎖內容的原子操作,也就是加鎖的代碼塊不能併發執行。在Synchronized段的代碼中,原子操作沒有執行完畢的時候,對於其他線程是阻塞的。當原子操作執行完畢後,將更改後的變量放到線程中的副本後(此時並沒有修改主存中變量的值),釋放加鎖資源,此時,其他線程有一定的機率讀到主存中還沒有經過修改的變量值。
附單例模式DCL實現(線程安全)
public class SingletonDCL {
//JDK1.5之後輕量級同步鎖volatile,能夠使變量在值發生改變時能儘快地讓其他線程知道
private volatile static SingletonDCL sInstance=null;
private SingletonDCL(){}
//在需要時菜初始化單例
public static SingletonDCL getInstance(){
//第一層判空是爲了避免不必要的同步
if(sInstance==null){
synchronized (SingletonDCL.class) {
//第二層判空是爲了在null的情況下創建實例
if(sInstance==null){
sInstance=new SingletonDCL();
}
}
}
return sInstance;
}
}
------歡迎各位大牛前來指點