2011-12-15 130 views
2

是什麼同步函數和同步塊之間有什麼區別?

public synchronized void addition() 
{ 
    //something; 
} 

public void addtion() 
{ 
    synchronized (//something) 
    { 
     //something; 
    } 
} 

之間的區別,如果我錯了,請忽略此問題。

+1

可能[dupplicate](http://stackoverflow.com/questions/1149928/what-is-the-difference-between-a-synchronized-method-and-synchronized-block-in-j) – Artem 2011-12-15 11:56:04

回答

2

重複第二個不編譯。如果你的意思是

public void addition() 
{ 
    synchronized (this) 
    { 
     //something; 
    } 
} 

然後它們是等效的。

5
public synchronized void addition() {...} 

相當於

public void addition() { 
    synchronized(this) { ... } 
} 

現在,如果你用不同的對象引用替換this,鎖定會使用其他對象的監視器來完成。

2

如果第二個示例是synchronized (this),則沒有區別。如果是別的東西,那麼鎖定對象是不同的。

0

同步方法在「this」對象上同步。如果它是一個塊,你可以選擇任何對象作爲鎖。

2
public synchronized void addition() 
{ 
    //something; 
} 

是一樣的:

public void addtion() 
{ 
    synchronized (this) 
    { 
     //something; 
    } 
} 

然而,在你的第二個例子,你可能想使用的東西從this不同的同步。

0

I)

public synchronized void addition() 
{ 
    //something; 
} 

II)

public void addtion() 
{  
    synchronized (//something)  
    { 
     //something;  
    } 
} 

在版本I(method level synchronization),在時間,方法的完整體只能由只有一個線程執行。

然而,版本II更靈活,因爲它被稱爲block level synchronization,您可以在synchronized (//something)之上添加一些行以並行執行它們。它應該是synchronized (this)

版本II應該是首選,因爲只有該代碼需要多線程(同步內),這是至關重要的。

相關問題