gpt4 book ai didi

java - 使用synchronized时寄存器刷新如何工作?

转载 作者:行者123 更新时间:2023-12-01 11:02:58 25 4
gpt4 key购买 nike

我从《Java Performance》一书中读到,下面的代码在具有许多寄存器的机器上运行时花费了令人惊讶的时间:

Vector v = initVector();
for (int i = 0; i < v.size(); i++) {
process(v.get(i));
}

因为 Vector 类的 get() 和 size() 方法是同步的,而且所有这些调用所需的寄存器刷新(到主内存)是一个巨大的性能问题。

避免这种情况的一种方法是将大量连续的、细粒度的同步调用包装在同步块(synchronized block)中,如下所示:

Vector v = initVector();
synchronized (v) {
for (int i = 0; i < v.size(); i++) {
process(v.get(i));
}
}

我确实有以下问题:

  1. 尽管 size() 和 get() 方法不会更改寄存器中变量的值,但为什么寄存器刷新的成本很高?在我看来,没有什么可以刷新回主内存的。我错了吗?
  2. 作者提出的解决方案是否意味着,一旦几个内部连续的同步方法被包装在外部同步调用中,内部的方法就不再进行寄存器刷新,并且在调用时只会有一个最终寄存器刷新外层?

谢谢!

最佳答案

  1. 只读方法仍然需要获取锁,否则另一个线程可以在您读取时进行更改,从而导致随机行为。

  2. 作者建议的解决方案仅在循环开始之前获取锁一次,并在循环结束时释放它。这样,您就可以跳过在循环的每一步都必须获取锁时可能发生的许多锁定/释放周期。

关于java - 使用synchronized时寄存器刷新如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33200047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com