2011-12-15 91 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应该是首选,因为只有该代码需要多线程(同步内),这是至关重要的。

相关问题