synchronized鎖住了誰

2021-08-29 20:15:07 字數 1586 閱讀 1040

先來看一段**

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...