当前位置: 首页 > 面试题库 >

为什么在Java中同步昂贵?

丁长卿
2023-03-14
问题内容

我对Java真的很陌生,我读到Java synchronized非常昂贵。我只想知道什么是昂贵的,它又如何昂贵?

谢谢。


问题答案:

也许还没有你想的那么糟

它曾经是可怕的(这可能就是您读到它“非常昂贵”的原因)。这些模因可能需要很长时间才能消失

由于涉及缓存刷新和失效的规则,因此Java语言中的同步块通常比许多平台提供的关键部分功能更为昂贵,而这些平台通常使用原子的“测试并设置位”机器指令来实现。即使程序仅包含在单个处理器上运行的单个线程,同步方法调用仍然比非同步方法调用慢。如果同步实际上需要竞争锁,则性能损失会更大,因为将需要多个线程切换和系统调用。

幸运的是,对JVM的持续改进既提高了Java程序的整体性能,又降低了与每个发行版同步的相对成本,并且可以预期将来会进行改进。此外,同步的性能成本通常被夸大了。一位著名的消息人士提到,同步方法调用的速度比非同步方法调用的速度慢50倍。尽管此声明可能是正确的,但它也极具误导性,并导致许多开发人员即使在需要时也避免进行同步

话虽这么说-
并发编程仍然可能很慢,但是现在并不是纯粹是Java的错。在精确锁定和粗糙锁定之间需要权衡。太粗糙显然是不好的,但也有可能太精细,因为锁的成本不为零。

重要的是要考虑竞争中的特定资源。机械硬盘是一个例子,其中多个线程可能会导致 糟糕的 性能。



 类似资料:
  • 我是一个学习如何在android上编码的模拟人,所以如果这个问题听起来很愚蠢,请容忍我。 我理解同步的要点。如果我有两个线程都可以访问和修改的数据,这可能会导致两个线程中数据变量的值不一致。 使方法同步并锁定它们直到一个线程执行完它(执行任何条件检查)是有意义的,但是为什么它与单个语句有关系呢?这对于多条语句来说很重要,因为在两条或更多条语句之间,线程一有可能会脱离可运行状态,但是我不明白一条语句

  • 问题内容: 我一直在尝试学习设计模式。该网站使用关键字,但我不知道它的作用。 我在网上搜索后发现,它与多线程和内存有一定关系,但是我是机械工程师,不知道这意味着什么。 有人可以帮我理解线程和关键字吗? 问题答案: C ++中没有关键字。 但是,在Java中有一种方法对于方法来说意味着以下两件事: * 同一对象上的两个同步方法调用不可能交错。当一个线程正在为对象执行同步方法时,所有其他为同一对象块调

  • 问题内容: 创建线程很昂贵。但是为什么价格昂贵呢?当创建Java线程使创建过程变得昂贵时,究竟发生了什么?我认为该说法是正确的,但是我只是对JVM中的线程创建机制感兴趣。 线程生命周期开销。线程创建和拆除不是免费的。实际开销因平台而异,但是线程创建会花费时间,从而在请求处理中引入延迟,并且需要JVM和OS进行某些处理活动。如果请求是频繁且轻量的(如在大多数服务器应用程序中一样),则为每个请求创建一

  • 如果我有时运行这些程序,它会在打印“玩家赢”或“玩家输”后继续运行,我可以找到原因。。 这里的输出: 球员滚轴3 2=5 分数是5 玩家滚轮6 4=10 游戏者滚轴6=12 玩家滚轮5 5=10 球员滚轴12=3 球员滚轴1 3=4 球员获胜 球员滚轴4 6=10 球员滚轴4 1=5 构建成功(总时间:0秒)

  • 我脑子里有一个问题。我读过静态同步方法锁定类对象,同步方法锁定对象的当前实例。那么锁定类对象是什么意思呢? 有人能在这个话题上帮我吗?

  • 问题内容: 我已经开始学习线程同步。 同步方法: 同步块: 什么时候应该使用方法和块? 为什么块比方法更好? 问题答案: 这不是更好的问题,只是有所不同。 同步方法时,实际上是在与对象本身进行同步。对于静态方法,您正在同步到对象的类。因此,以下两段代码以相同的方式执行: 就像您写的一样。 如果要控制到特定对象的同步,或者只想将方法的 一部分 同步到该对象,则指定一个块。如果在方法声明上使用关键字,