哪个更有效,为什么?

Fav*_*ius 3 java concurrency multithreading

在下面的两个同步策略中,哪一个被优化(如在处理和生成的字节代码中)以及应该使用其中一个的场景.

public synchronized void addName(String name) 
{
       lastName = name;
       nameCount++;
       nameList.add(name);
}
Run Code Online (Sandbox Code Playgroud)

要么

public void addName(String name) {
    synchronized(this) {
        lastName = name;
        nameCount++;
        nameList.add(name);
    }

}
Run Code Online (Sandbox Code Playgroud)

还有什么是处理并发的可行方法:

  1. 使用java.util.concurrent
  2. 使用上面的低级方法
  3. 使用JobUIJobAPI(如果在eclipse PDE环境中工作)

谢谢

Mic*_*rdt 5

  • 您更新的两段代码在语义上是相同的.但是,使用第二部分中的同步块可以让您进行更多控制,因为您可以在不同的对象上进行同步,或者实际上不同步不需要的方法部分.
  • 使用java.util.concurrent是非常preferrable使用同步原语只要有可能,因为它可以让你在更高的抽象级别上工作,并用它的作者是非常熟练的人,测试集中的代码.
  • 如果你在eclipse PDE中工作,那么使用它的API很可能是可取的,因为它与平台的其他部分相关联.


Kin*_*Kin 5

哪一个被优化(如在处理和生成的字节代码中)

根据这篇IBM DeveloperWorks文章第1节,与synchronized块相比,synchronized方法生成的字节码更少.这篇文章解释了原因.

文章摘录:

当JVM执行synchronized方法时,执行线程识别方法的method_info结构设置了ACC_SYNCHRONIZED标志,然后它自动获取对象的锁,调用方法并释放锁.如果发生异常,则线程会自动释放锁.

另一方面,同步方法块绕过JVM内置的对获取对象锁和异常处理的支持,并要求以字节代码显式写入功能.如果您读取具有同步块的方法的字节代码,您将看到十几个额外的操作来管理此功能.清单1显示了生成synchronized方法和synchronized块的调用:

编辑发表第一条评论

为了给其他SOers信用,这里有一个很好的讨论为什么人们会使用同步.块.如果你搜索一下,我相信你可以找到更多有趣的讨论:)

使用同步方法而不是同步块是否有优势?

我个人没有必要使用同步.阻止锁定另一个对象this,但这是一个使用SOers指出同步.块.