【问题标题】:Does volatile mean it is thread safevolatile 是否意味着它是线程安全的
【发布时间】:2012-01-30 04:14:30
【问题描述】:

在 Java 中,当我们想确保编译器不应该通过保留变量的本地副本来进行优化时,我们将变量设置为 volatile。将变量用作 volatile 可确保线程不会使用变量的本地副本,但会使用存储在主存储器中的变量。但是,这是否意味着 volatile 变量是线程安全的?此外,在原始类型和我们使用用户定义对象的情况下,它有何不同?

【问题讨论】:

标签: java thread-safety compiler-optimization


【解决方案1】:

volatile 表示值永远是新鲜的;如果另一个线程将一个新对象放入您之前的变量中,您将看到该对象。

它不会改变值的行为;你不能神奇地使对象成为线程安全的。

【讨论】:

  • 根据您认为的“价值”,volatile 甚至不保证可变类的新鲜度。如果类是不可变的和最终的,那么标记它的引用volatile 将使它成为线程安全的。
  • @yshavit:如果变量是final,那么volatile 不会有任何区别,AFAIK。
  • 最终类,我的意思是这个类被标记为final(不能扩展),而不是它的引用被标记为final。字段final List<Foo> list = ArrayList<Foo> 不是线程安全的,因为ArrayList 不是不可变的。但我指的是volatile String 是线程安全的(不包括与其他字段的原子性),因为String 是不可变的。
  • 我明白了;我误解了你。是的。
【解决方案2】:

完全没有,事实上,volatile 表示该值可以被另一个线程同时看到,但don't 表示它是线程安全的,它不是线程安全的。

你可以看到这个:http://java.sun.com/docs/books/jls/third_edition/html/classes.html 并找到keyworkd volatile Fields

另一个参考这里:http://www.ibm.com/developerworks/java/library/j-jtp06197/index.html

【讨论】:

    【解决方案3】:

    volatile 变量确保可见性并且不是原子的。

    【讨论】:

      【解决方案4】:

      易失性通常最适合“简单”状态。前任。一个布尔成员变量,可以设置为告诉工作线程终止。

      【讨论】:

        【解决方案5】:

        volatile 变量的值永远不会存储在线程本地。

        所有读取和写入都进入主内存。

        meaning of volatile is different depending on the version of Java (i.e till Java 1.4 and after Java5.0).

        one more link about volatile

        【讨论】:

        • 易失性并不一定意味着写入主内存。这意味着每个线程将读取最新的值。您可以阅读缓存一致性以了解这是如何实现的
        猜你喜欢
        • 2011-04-17
        • 1970-01-01
        • 2012-12-17
        • 1970-01-01
        • 1970-01-01
        • 2020-05-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多