簡體   English   中英

synchronized(this)和synchronized方法有什么區別

[英]What is the difference between synchronized(this) and synchronized method

可以說我們有這兩個示例代碼:

public synchronized void getSomething(){
     this.hello = "hello World";
}

還有這個

public void getSomething(){
   synchronized(this){
     this.hello = "hello World";
   }
}

所以有人可以告訴我現在的區別是什么?

兩種不同的方法在功能上是等同的 可能存在非常小的性能差異:

在字節碼級別, synchronized方法將其對同步的需要通告為方法的訪問標志中的位集。 JVM查找此位標志並進行適當的同步。

synchronized塊通過存儲在類文件的方法定義中的一系列字節碼操作來實現其同步。

因此,同步方法可能執行得稍快一些,並且在字節碼方面占用的空間更少。

同樣,根據規范,這兩者在功能上是相同的。

我猜測性能差異可以忽略不計,代碼風格指南應該勝出。 有些編譯器甚至可能將塊優化為訪問標志。 JIT可能會消除性能差異。

看看這篇文章的這一部分:

http://www.ibm.com/developerworks/ibm/library/it-haggar_bytecode/#4

它解釋了雖然功能一致(同步方法要么鎖定實例對象,要么在靜態方法的情況下鎖定方法所在的類的Class對象),同步方法更加優化,因為它不是在字節碼中同步(如同步塊語句那樣),它在JVM級別進行同步。

一個區別是同步的代碼的粒度。 在第一個示例中,您基本上是鎖定整個方法,而在第二個示例中,只會鎖定方法的一部分。 對於不需要完全同步的長方法,第二種方法更好。 最好只在需要時鎖定,並盡快釋放其他線程的鎖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM