我们何时在同步方法和同步块之间进行调用

时间:2010-05-13 07:23:47

标签: java synchronization

任何人都可以分享他们的经验 “我们何时拨打在Synchronized方法和Synchronized Block之间使用” 任何性能问题?

5 个答案:

答案 0 :(得分:1)

  

我们什么时候打电话在Synchronized方法和Synchronized Block之间使用。

如果要在方法调用的持续时间内锁定并且要锁定this(或当前类,对于static方法),则synchronized方法是正确的解决方案。

如果您正在锁定其他内容(例如私有锁对象或某些内部数据结构),那么同步块方法会更好。

类似地,如果过程调用中的某些代码只需要持有一个锁,那么最好使用一个synchronized块并将代码放在块中。

  

任何性能问题?

没有,除了一般校长之外,握住锁的时间比你需要的还要长。 (锁定越长,其他线程就越需要等待。)

答案 1 :(得分:0)

我不确定“同步声明”是什么意思。您可以使用synchronized关键字来表示方法已同步或(如您所述)其中的代码块。

我通常倾向于保持方法小且易于管理,因此将整个方法标记为已同步(如果需要)。这具有以下优点:对于类的用户来说,关于哪些方法代表关键部分是立即明显的。它还允许您作为程序员更轻松地确定类是否是线程安全的,即:是否所有公共方法都访问标记为synchronized的可变数据?

两种方法之间没有性能差异,因为两者都需要获得锁定。

答案 2 :(得分:0)

如果可能的话,总是尝试使用同步块,对于任何情况都不可能,然后转到同步方法。将是很多性能改进取决于没有。 Synchronized方法中的行数。没有。线条增加,性能会下降。

答案 3 :(得分:0)

当需要同步(例如同步集合)和用于类内部同步的同步块(例如访问需要线程安全的共享资源)的公共接口时,我倾向于使用synchronized方法。

还有一个可读性问题。我发现方法级别同步更整洁,更明显,因为代码不会被锁管理混乱。

至于表现,我不知道任何一种方法的行为都有任何特别的差异。我认为避免过度同步更重要,因此只需要访问10次调用中的共享资源1的方法应该使用块级而不是方法级同步。

我对任何特定场景的处理方法通常基于这些因素的混合,并根据之前的经验进行修改。

答案 4 :(得分:0)

就整体性能而言,具有同步块或方法之间没有区别。问题实际上是编码实践。然而,同步方法似乎很容易,当在项目中与多个人一起工作时,某人可能会改变其他人同步到繁重操作中的简单光照方法。事实上,您可能遇到麻烦的一个非常好的例子(来自个人经验)是您使用依赖注入框架并且您在服务对象中有与同步的数据访问对象(daos)交互的方法。期望是daos执行得很快,所以只能暂时保持锁定。其他人出现并且要么改变daos,要么创建并注入速度慢得多的新东西,突然事情开始变慢,因为服务对象已经与它同步交互。

我不认为同步块可以解决我上面描述的问题,但至少对于synchronized块,它们比方法中的声明更难错过。