先來看一段**
public class multithread else
system.out.println("tag " + tag + ", num = " + num);
} catch (interruptedexception e) }
//注意觀察run方法輸出順序
public static void main(string args)
});thread t2 = new thread(new runnable()
});
t1.start();
t2.start();
}}
執行之後得到的結果由隨機性:
可能是
tag b, set num over!
tag a, set num over!
tag b, num = 200
tag a, num = 200
也可能是
tag a, set num over!
tag b, set num over!
tag b, num = 500
tag a, num = 500
當然,還有其他的可能性,這裡就不一一枚舉了。
可以看到,synchronized沒起作用。這是因為synchronized鎖住的是物件,執行緒t1,t2分別獲取的是m1,m2的鎖,他們並沒有在獲取鎖上有競爭關係,因此,出現非同步的結果。
那如果要讓printnum方法在多個物件之間也是執行緒安全的呢,乙個物件在執行這個方法時,其他物件必須阻塞等待,一次只能有乙個物件能執行這個方法。只需要加個static關鍵字來修飾printnum方法,這時synchronized關鍵字鎖住的就是multithread的.class類了。
將printnum方法修改如下:
public static synchronized void printnum(string tag)
...
結果如下:
tag b, set num over!
tag b, num = 500
tag a, set num over!
tag a, num = 200
或者:
tag a, set num over!
tag a, num = 200
tag b, set num over!
tag b, num = 500
這時的輸出結果就符合我們的預期了。
最後,總結一下:
synchronized的使用情況大概就是下面幾種:
synchronized修飾非靜態方法、同步**塊的synchronized (this)用法和synchronized (非this物件)的用法鎖的是物件,執行緒想要執行對應同步**,需要獲得物件鎖。
synchronized修飾靜態方法以及同步**塊的synchronized (類.class)用法鎖的是類,執行緒想要執行對應同步**,需要獲得類鎖。
Java synchronized 鎖住了什麼
synchronized 有三種使用場景 1 是某個物件例項內,synchronized amethod 可以防止多個執行緒同時訪問這個物件的synchronized方法 如果乙個物件有多個synchronized方法,只要乙個執行緒訪問了其中的乙個synchronized方法,其它執行緒不能同時訪...
synchronized鎖住物件筆記
1.synchronized用在靜態方法的時候,表示執行這個方法時,將會把呼叫該方法的物件給鎖住。2.synchronized this 的時候,表示執行synchronized內的 時,鎖住this物件,也就是當前 所在類的物件。3.synchronized other class 的時候,表示執...
synchronized鎖住的物件問題
示例1 package com.執行緒間通訊 public class mutithread1 else catch interruptedexception e system.out.println tag tag a a public static void main string args t...