maa*_*nus 95

  • 除long和double之外的所有原始类型的赋值
  • 所有参考作业
  • 所有volatile变量的赋值
  • java.concurrent.Atomic*classes的所有操作

也许还有更多.看看jls.

正如评论中所指出的,原子性并不意味着可见性.因此,虽然保证另一个线程不会看到部分写入int,但它可能永远不会看到新值.

long和double上的操作也是普通的64位CPU 原子,尽管不能保证.另请参阅此功能请求.

  • 对`volatile` longs和double的赋值保证是原子的:http://java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7 (20认同)
  • 另外,请记住,虽然操作是原子操作,但是在多线程应用程序中可能无法保证这些操作的可见性,除非特别小心(此处的详细信息是*方式*复杂以在注释中描述..) (11认同)
  • `64位jvm,长和双赋值也是原子的.你确定吗?我会说它们是用于编译代码的,但是解释代码呢?可能你是对的,但有任何保证吗? (5认同)
  • 该规范仍然没有要求64位JVM为长和双分配提供原子性.http://java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7用其着名的词语,"这种行为是特定于实现的".但是,更有可能的是,64位VM会将其实现为原子操作. (4认同)
  • 恕我直言,正常的引用分配是原子的,但 AtomicReference 提供了更多功能:compareAndSet 和 getAndSet,如果没有同步,您就无法实现这一点。 (2认同)

sgo*_*les 7

在 Java 中,32 位或更小的数量的读写保证是原子的。
原子,我们的意思是每个动作都发生在一个步骤中并且不能被中断。因此,当我们有多线程应用程序时,读写操作是线程安全的,不需要同步。

例如,以下代码是线程安全的:

public class ThreadSafe   
  {  
    private int x;  
    public void setX(int x)  
          {
           this.x = x;
           } 
  }
Run Code Online (Sandbox Code Playgroud)

  • ..threadsafe 在某种意义上说,该值将始终是原始值或设置值。由于缺少“易失性”或“同步”,大多数最新值仍然不一定对其他线程可见。 (7认同)
  • 对@MikkoWilkman 所说的话+1。不应使用该代码,因为从内存可见性的角度来看它绝对不是线程安全的。 (3认同)