AtomicBoolean vs synchronized块

bia*_*bit 7 java synchronized-block atomicboolean

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

这是一个例子synchronized:

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

        this.toggled = true;
        // do other stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

替代方案AtomicBoolean:

public void toggleCondition() {
    if (!this.condition.getAndSet(true)) {
        // do other stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

利用AtomicBooleanCAS的属性应该比依赖同步更快,所以我运行了一些微基准测试.

对于10个并发线程和1000000次迭代,AtomicBoolean只比synchronized块快一点.

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

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

我知道微基准值得他们值得,但差异不应该更高吗?

Ste*_*n C 6

我知道微基准值得他们值得,但差异不应该更高吗?

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

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

更改基准,以便每个线程切换几百万次条件.这将保证很多锁争用,我希望你会看到性能差异.

编辑

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

在这一点上,我应该问你为什么要把注意力集中在这个方面.您是否已分析过您的应用程序并确定您确实存在锁定争用问题?或者你只是猜测?你有没有获得关于过早优化的邪恶的标准讲座?

  • 关于你的编辑,我有.我没有性能问题,我只是好奇; 最后我听说这不是一件坏事. (2认同)