为什么在Java中同步昂贵?
我对Java真的很陌生,并且我读到“synchronized”在Java中“非常昂贵”。 我想知道的是什么是昂贵的,它是如何昂贵的? 谢谢。
也许它没有你想象的那么糟糕
它曾经是可怕的(这可能是你读到它“非常昂贵”的原因)。 这些模因可能需要很长时间才能消失
这里有一篇很好的文章
同步费用是多少?
由于涉及缓存刷新和失效的规则,Java语言中的同步块通常比许多平台提供的关键部分设施要昂贵,这些平台通常使用原子“测试和设置位”机器指令来实现。 即使程序仅包含在单个处理器上运行的单个线程,同步方法调用仍然比非同步方法调用慢。 如果同步实际上需要争用锁定,则性能损失会大大增加,因为会有多个线程切换和系统调用需要。
幸运的是,JVM的持续改进既提高了整体Java程序的性能,又降低了每个发行版的相对同步成本,并且预计未来的改进。 此外,同步的性能成本往往被夸大了。 一个众所周知的消息来源称,同步方法调用比非同步方法调用慢50倍。 虽然这种说法可能是真实的,但它也很具误导性,并导致许多开发人员甚至在需要时避免同步。
话虽如此 - 并发编程仍然可能很慢,但不是现在它纯粹是Java的错误。 精细锁定和粗略锁定之间存在折衷。 太粗糙显然是不好的,但也可能太好,因为锁具有非零成本。
争论中考虑特定资源非常重要。 机械硬盘是一个例子,更多的线程可能会导致更糟的性能。
它的代价很高,因为如果你使用线程,并且许多线程必须通过一段同步的代码段,那么一次只能执行其中的一段。
这就像一个瓶颈。
当你使用单线程时它甚至是昂贵的,因为无论如何,它都必须检查是否允许它运行。
如果你减少同步段的使用,你的线程就不必停下来看看它们是否可以运行(当然,它们不需要共享数据)
这里可以找到关于同步如何工作的高级概述
http://img20.imageshack.us/img20/2066/monitor28synchronizatioc.png
Java风格的监视器
IBM的这篇文章实际上很好地总结了同步背后的主要观点。
由于涉及缓存刷新和失效的规则,Java语言中的同步块通常比许多平台提供的关键部分设施要昂贵,这些平台通常使用原子“测试和设置位”机器指令来实现。 即使程序仅包含在单个处理器上运行的单个线程,同步方法调用仍然比非同步方法调用慢。 如果同步实际上需要争用锁定,则性能损失会大大增加,因为会有多个线程切换和系统调用需要。
链接地址: http://www.djcxy.com/p/12545.html