同步函数和同步块之间有什么区别?

时间:2011-12-15 11:53:36

标签: java multithreading locking synchronized

之间有什么区别
public synchronized void addition()
{
   //something;
}

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

如果我错了,请忽略这个问题。

7 个答案:

答案 0 :(得分:5)

public synchronized void addition() {...}

相当于

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

现在,如果用另一个对象引用替换this,则将使用该另一个对象的监视器完成锁定。

答案 1 :(得分:2)

第二个没有编译。如果你的意思是

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

然后他们就等同了。

答案 2 :(得分:2)

如果第二个例子是synchronized (this),那么没有区别。如果它是其他东西,那么锁定对象是不同的。

答案 3 :(得分:2)

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

与:

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

然而,在第二个示例中,您可能希望使用与this不同的内容进行同步。

答案 4 :(得分:1)

第一个只有一个线程可以一次执行整个方法,而在第二个线程中,只有一个线程可以执行该同步块,如果没有使用这个作为参数。

这里是它的副本Is there an advantage to use a Synchronized Method instead of a Synchronized Block?

答案 5 :(得分:0)

同步方法在“this”对象上同步。如果它是一个块,你可以选择任何对象作为锁。

答案 6 :(得分: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应该是首选,因为只有代码需要多线程(在同步中)才是关键。