1.synchronized的意義
synchronized用於多執行緒設計,有了synchronized關鍵字,多執行緒程式的執行結果將變得可以控制。synchronized關鍵字用於保護共享資料。
2.synchronized實現同步的機制
synchronized依靠"鎖"機制進行多執行緒同步,"鎖"有2種,一種是物件鎖,一種是類鎖。
3.此下面2種是依靠物件鎖鎖定,初始化一個物件時,自動有一個物件鎖。synchronized {普通方法}依靠物件鎖工作,多執行緒訪問ynchronized方法,一旦某個程式搶得鎖之後,其他的程式只有排隊對待。
synchronized void method{}功能上,等效於
void method{
synchronized(this)
}
}
synchronized {修飾程式碼塊}的作用不僅於此,synchronized void method{}整個函式加上synchronized塊,效率並不好。在函式內部,可能我們需要同步的只是小部分共享資料,其他資料,可以自由訪問,這時候我們可以用 synchronized(表示式){//語句}更加精確的控制。
4.synchronized {static方法}此程式碼塊等效於
void method{
synchronized(Obl.class)
}
}
使用該類的類物件的鎖定去做執行緒的共享互斥.
5.synchronized {run方法}run方法的鎖定.
這個舉例比較好說。
public class MyThread implement Runnable{
public void run(){
for(int i=0;i<10;i++){
System.out.println(i+" ");
}
}
}
如果在主程式多執行緒執行
MyThread t=new MyThread ();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
其結果是混亂不堪的。
如果加了synchronized當前執行緒取完所有資料後,才會釋放鎖,所以結果可以預知。4個執行緒輸出總是0,1...9
synchronized method(){}可以防止多個執行緒同時訪問這個物件的synchronized方法,如果一個物件有多個synchronized方法,只要一個線 程訪問了其中的一個synchronized方法,那麼其它執行緒不能同時訪問這個物件中的任何一個synchronized方法,但可以訪問這個物件中的非synchronized方法。