java:一个同步vs多个同步在同一代码上

问题描述 投票:1回答:1

一个同步比很多同步好吗?

synchronized(this)
{
   CODE1
   CODE2 // uncritically code, short duration
   CODE3
   CODE4 // uncritically code, short duration
   CODE5
}

VS

synchronized(this)
{
   CODE1
}

CODE2 // uncritically code, short duration

synchronized(this)
{
   CODE3
}

CODE4 // uncritically code, short duration

synchronized(this)
{
   CODE5
}

以下内容适用:同步块尽可能小,就像我在secound示例中编码的一样。

但是无论如何都是这样吗?如果在短时间段内随意编写了代码片段,那么如果我不锁定,未锁定,未锁定等等,也许我的程序性能更高?

java concurrency synchronized
1个回答
0
投票

JVM的优化器可以帮助提高性能,但可以加入相邻的同步块,但不能相反,因为拆分会改变语义。

请参见Java SE 6性能白皮书,2.1.2 Lock coarsening

有一些锁定模式,其中释放一个锁,然后在一段这段代码之间没有可观察到的操作的情况下重新获得锁。热点中实施的锁定粗化优化技术消除了在那种情况下的解锁和重新锁定操作[…]。通过扩大现有的同步区域,基本上可以减少同步工作量。

对Java 6的引用表明,这甚至不是一个全新的功能因此,如果您知道存在非关键代码,并且整个代码都可以临时释放该锁(可能会被其他线程在其间更改状态),那么请使用多个同步块,以告知JVM和人类读者CODE2和CODE4并不重要。

[这遵循了让运行时优化器进行正确权衡的典型模式,因为它比我们更了解实际情况,即硬件和实际应用程序行为。

© www.soinside.com 2019 - 2024. All rights reserved.