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

标签 java multithreading performance mutex

Mutexes在许多编程语言中都很常见,例如C/C++。我想念他们在 Java 中的表现。但是,我可以通过多种方式编写自己的 class Mutex:

  • Mutex 上使用简单的同步关键字。
  • 使用二进制 semaphore .
  • 使用原子变量,如讨论的那样 here .
  • ...?

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

最佳答案

Mutexes are pretty common in many programming languages, like e.g. C/C++. I miss them in Java.

不确定我是否关注您(特别是因为您在问题中给出了答案)。

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

    public void someMethodThatNeedsAMutex() {
        synchronized(mutex) {
            //here you hold the mutex
        }
    }
}

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

public class SomeClass {

    public synchronized void someMethodThatNeedsAMutex() {
        //here you hold the mutex
    }
}

What is the fastest (best runtime) way?

获取/释放监视器本身不会是一个重大的性能问题(您可以阅读 this blog post 以查看对影响的分析)。但是,如果您有许多线程争夺锁,则会造成争用并降低性能。

在这种情况下,最好的策略是如果您主要读取数据(正如 Marko 在评论中指出的那样,无锁使用 CAS 操作,这可能涉及重试如果你有很多写线程,会写很多次,最终导致性能变差)或者更好,避免在线程之间共享太多东西。

关于java - Java 编写互斥锁的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14337296/

相关文章:

java - 从 map 中获取条目集

java - 计算循环和 fcfs 作业时间

java - 通过同一个 ActiveMQConnectionFactory 使用多个 ActiveMQ 队列

通过执行器重用java线程

python - threading.local() 是在 Google AppEngine 中为单个请求存储变量的安全方法吗?

c++ - 在 GLSL 中重新使用内置 OpenGL 变量定义自己的制服。为什么?

php - MySQL 性能 - "IN"子句与单个值的等于 (=)

java - Hibernate saveOrUpdate 大数据

java - 为什么不能重新启动 Java Thread 对象?

java - 在 IOS 和 Java 之间发送图像