为什么在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

上一篇: Why are synchronize expensive in Java?

下一篇: Scripting Language vs Programming Language