Java 原子操作-读和写是什么意思?

Java 原子操作-读和写是什么意思?,java,atomic,Java,Atomic,有一件事我不了解并发性——线程和原子操作。根据docs.oracle,这些操作被指定为原子操作: 对于引用变量和大多数基本变量(除long和double之外的所有类型),读和写都是原子的 对于所有声明为volatile的变量(包括long和double变量),读写都是原子的 但与此同时,docs.oracle断言增加变量不是一个原子操作。我以为这是一篇文章: private int number; number++; 显然,我不明白“读”和“写”是什么意思 有人能解释一下,并举一个“读

有一件事我不了解并发性——线程和原子操作。根据docs.oracle,这些操作被指定为原子操作:

  • 对于引用变量和大多数基本变量(除long和double之外的所有类型),读和写都是原子的
  • 对于所有声明为volatile的变量(包括long和double变量),读写都是原子的
但与此同时,docs.oracle断言增加变量不是一个原子操作。我以为这是一篇文章:

 private int number;
 number++;
显然,我不明白“读”和“写”是什么意思

有人能解释一下,并举一个“读”和“写”的例子吗

编辑:在不同步的情况下执行此操作时,程序会受到线程干扰。所以我知道它不是原子的。但是,当我更改另一个变量时,它属于这些线程共享的对象——没有任何干扰。
此对象的共享变量通过一个mutator进行更改。

为了实现
number++
,运行时需要

  • 获取
    编号的当前值(读取)

  • 增加该值

  • 将新值写回
    编号
    (写入)

  • 如果另一个线程在2时从1开始,则
    number
    的最终值将不正确,因为该线程仍将读取原始值


    如果1、2和3作为一个原子操作执行(即在完成3之前线程无法启动1),那么一切都会好起来。

    为了实现
    number++
    ,运行时需要

  • 获取
    编号的当前值(读取)

  • 增加该值

  • 将新值写回
    编号
    (写入)

  • 如果另一个线程在2时从1开始,则
    number
    的最终值将不正确,因为该线程仍将读取原始值


    如果1、2和3作为原子操作执行(即,在完成3之前,线程无法启动1)然后一切都会好起来。

    增加一个值并引用一个值与增加也做一个和不同:这打破了原子性,因为不仅仅是简单的读或写。

    增加一个值并引用一个值与增加也做一个和不同:这打破了原子性,因为有多个值简单的读或写。

    您正确地认为,
    number++
    涉及写入,但也涉及读取。根据定义,原子操作是完全成功或完全失败的单个操作。因为
    number++
    执行多个独立的操作,所以它不是原子的。但是,有一些API可以作为单个操作原子地增加值。在运行时,这些API使用专门的CPU指令,这些指令能够作为单个工作单元执行读写操作

    对字对齐、字大小(或更小)值的单个读取或写入是原子的,例如:

    int x;
    x = 5  // write 'x'
    5 + x  // read 'x'
    
    所以你可能确实理解什么是读或写;您可能没有考虑到<代码> ++< /COD>运算符执行两个离散。

    在没有同步的情况下执行此操作时,程序会受到线程干扰。所以我知道它不是原子的。但是,当我更改另一个变量时,它属于这些线程共享的对象——没有任何干扰。此对象的共享变量通过一个mutator进行更改


    如果您在没有同步机制或原子操作的情况下操作共享数据,并且没有看到数据竞争,那么您很幸运,或者数据竞争正在发生,而您没有注意到。很难说没有看到您的实际代码。

    您正确地认为
    number++
    涉及写入,但也涉及读取。根据定义,原子操作是完全成功或完全失败的单个操作。因为
    number++
    执行多个独立的操作,所以它不是原子的。但是,有一些API可以作为单个操作原子地增加值。在运行时,这些API使用专门的CPU指令,这些指令能够作为单个工作单元执行读写操作

    对字对齐、字大小(或更小)值的单个读取或写入是原子的,例如:

    int x;
    x = 5  // write 'x'
    5 + x  // read 'x'
    
    所以你可能确实理解什么是读或写;您可能没有考虑到<代码> ++< /COD>运算符执行两个离散。

    在没有同步的情况下执行此操作时,程序会受到线程干扰。所以我知道它不是原子的。但是,当我更改另一个变量时,它属于这些线程共享的对象——没有任何干扰。此对象的共享变量通过一个mutator进行更改


    如果您在没有同步机制或原子操作的情况下操作共享数据,并且没有看到数据竞争,那么您很幸运,或者数据竞争正在发生,而您没有注意到。很难说没有看到您的实际代码。

    “显然,我不明白“读”和“写”是什么意思。”。你可能知道。但是,当你增加变量时,你可能没有考虑真正发生的事情。“史蒂芬C -是的,我知道一些程序集,知道高级代码涉及几个指令提取执行……将变量放入寄存器A。将1添加到寄存器A。将其放回内存,依此类推“显然,我不明白“读”和“写”是什么意思。”。你可能知道。但是,当你增加变量时,你可能没有考虑真正发生的事情。“史蒂芬C -是的,我知道一些程序集,知道高级代码涉及几个指令提取执行……将变量放入寄存器A中。