【问题标题】:What is the difference between a synchronized function and synchronized block? [duplicate]同步函数和同步块有什么区别? [复制]
【发布时间】:2012-01-21 03:01:18
【问题描述】:

有什么区别

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

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

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

【问题讨论】:

标签: java multithreading locking synchronized


【解决方案1】:
public synchronized void addition() {...}

等价于

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

现在,如果您将 this 替换为不同的对象引用,则锁定将使用该其他对象的监视器完成。

【讨论】:

    【解决方案2】:

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

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

    那么它们是等价的。

    【讨论】:

      【解决方案3】:

      如果第二个例子是synchronized (this),那么没有区别。如果是别的东西,那么锁对象就不一样了。

      【讨论】:

        【解决方案4】:
        public synchronized void addition()
        {
           //something;
        }
        

        等同于:

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

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

              我)

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

              二)

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

              在第一版(method level synchronization)中,一次完整的方法体只能由一个线程执行。

              然而,版本 II 更灵活,因为它被称为 block level synchronization,您可以在 synchronized (//something) 上方添加一些行以并行执行它们。应该是synchronized (this)

              应该首选版本 II,因为只有代码需要是关键的多线程(在同步内)。

              【讨论】:

                猜你喜欢
                • 2010-11-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-05-22
                • 2016-10-14
                • 2011-01-09
                • 2012-01-15
                • 1970-01-01
                相关资源
                最近更新 更多