Java编写互斥锁的最快方法?

Joh*_*nes 5 java performance multithreading mutex

互斥体在许多编程语言中很常见,例如C/C++.我想念他们用Java.但是,我可以通过多种方式编写自己的方法class Mutex:

  • 使用简单的synchronized关键字Mutex.
  • 使用二进制信号量.
  • 使用原子变量,比如讨论在这里.
  • ...?

什么是最快(最好的运行时)方式?我认为同步是最常见的,但性能呢?

ass*_*ias 15

互斥体在许多编程语言中很常见,例如C/C++.我想念他们用Java.

不确定我是否跟着你(特别是因为你在问题中给出答案).

public class SomeClass {
    private final Object mutex = new Object();

    public void someMethodThatNeedsAMutex() {
        synchronized(mutex) {
            //here you hold the mutex
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以简单地使整个方法同步,这相当于this用作互斥对象:

public class SomeClass {

    public synchronized void someMethodThatNeedsAMutex() {
        //here you hold the mutex
    }
}
Run Code Online (Sandbox Code Playgroud)

什么是最快(最好的运行时)方式?

获取/发布监视器本身不会成为重要的性能问题(您可以阅读此博客文章以查看对影响的分析).但是如果你有许多线程争夺锁定,它将产生争用并降低性能.

在这种情况下,最好的策略是如果你主要是在阅读数据时不使用"无锁"算法来使用互斥锁(正如Marko在评论中指出的那样,无锁使用CAS操作,这可能涉及多次重试写入如果你有很多写线程,最终导致更差的性能)甚至更好,避免在线程之间共享太多东西.


Mar*_*nik 5

情况正好相反:Java设计师很好地解决了它,你甚至都不认识它:你不需要一流的Mutex对象,只需要synchronized修饰符.

如果你有一个特殊的情况,你想以非嵌套的方式兼顾你的互斥体,那么总会有ReentrantLock并且java.util.concurrent提供丰富的同步工具,远远超出原始的互斥体.