gpt4 book ai didi

java - AtomicBoolean 与同步块(synchronized block)

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:19:01 35 4
gpt4 key购买 nike

我试图通过用 AtomicBoolean 替换一些 synchronized block 来减少代码中的线程争用。

这是一个使用synchronized 的例子:

public void toggleCondition() {
synchronized (this.mutex) {
if (this.toggled) {
return;
}

this.toggled = true;
// do other stuff
}
}

还有 AtomicBoolean 的替代方案:

public void toggleCondition() {
if (!this.condition.getAndSet(true)) {
// do other stuff
}
}

利用 AtomicBoolean 的 CAS 属性应该比依赖同步要快得多,所以我运行了一个 little micro-benchmark .

对于 10 个并发线程和 1000000 次迭代,AtomicBoolean 仅比 synchronized block 快一点。

使用 AtomicBoolean 在 toggleCondition() 上花费的平均时间(每个线程):0.0338

使用同步的 toggleCondition() 花费的平均时间(每个线程):0.0357

我知道微观基准的值(value)与它们的值(value)相同,但差异不应该更高吗?

最佳答案

I know micro-benchmarks are worth what they're worth but shouldn't the difference be higher?

我认为问题出在您的基准测试中。看起来每个线程只会切换一次条件。基准测试将花费大部分时间来创建和销毁线程。任何给定线程在任何其他线程切换条件的同时切换条件的可能性将接近于零。

当存在对条件的显着争用时,AtomicBoolean 比原始锁定具有性能优势。对于无竞争条件,我希望看到的差别不大。

更改您的基准测试,使每个线程切换条件数百万次。这将保证大量的锁争用,我希望您会看到性能差异。

编辑

如果您打算测试的场景每个线程只涉及一个切换(和 10 个线程),那么您的应用程序不太可能遇到争用,因此使用 AtomicBoolean 不太可能产生任何影响。

在这一点上,我应该问你为什么把注意力集中在这个特定方面。您是否分析过您的应用程序并确定确实您有锁争用问题?或者你只是在猜测?您是否听过有关过早优化弊端的标准讲座?

关于java - AtomicBoolean 与同步块(synchronized block),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3848070/

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