c++ - 我们是否需要将 volatile 关键字和互斥锁一起用于线程安全?

标签 c++ multithreading thread-safety volatile

为临界区设置互斥锁表明不止一个线程无法破坏临界区,但为什么我们需要 volatile 变量来做同样的事情?

如果下面的代码中没有volatile字会怎样?

enter image description here

最佳答案

volatile 关键字使双重检查锁定在 1.5 及更高版本的 JVM 上正常工作,请参阅 Under the new Java Memory Model该页面的一部分。

如果没有 volatile 关键字,则可能会在 1.5 及更高版本的 JVM 上创建两个实例。在 1.5 之前的 JVM 上,双重检查锁定被认为是完全错误的,不应使用。

然而,在初始化单例的情况下,使用双重检查锁定通常被认为是不值得的,简单的静态初始化就足够了。如果您绝对知道您的应用程序会在某个时候初始化单例,那么惰性实例化就是多余的。只是去:

private static Singleton s_instance = new Singleton() 

或任何 C++ 等价物。又好又安全!

由于这个问题最终导致了 Java 和 C++ 的困惑,请注意,我指的是上面的 Java。 C++中没有synchronized关键字,volatile不适用于并发。

关于c++ - 我们是否需要将 volatile 关键字和互斥锁一起用于线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10480153/

相关文章:

VS2012 中的 c++11 线程/互斥锁实现 - 触发断言

c++ - 重新分配后删除 C++ 中的数组指针是否安全?

c++ - printf 网络数据

java - 将cpp函数指针转换为java接口(interface)方法

c - 如何在 OS X 上编译 OpenMP 和 MPI 混合 C 程序

java - 为什么 akka 需要不可变消息

c++ - 获取公共(public) IP 地址而不是本地主机 (Boost Asio)

multithreading - Silverlight - 一次将应用程序限制为一个 WCF 调用

java - 使Java设置线程安全

c++ - 将只读数据安全地传递给新线程