Java 原子操作-读和写是什么意思?
有一件事我不了解并发性——线程和原子操作。根据docs.oracle,这些操作被指定为原子操作:Java 原子操作-读和写是什么意思?,java,atomic,Java,Atomic,有一件事我不了解并发性——线程和原子操作。根据docs.oracle,这些操作被指定为原子操作: 对于引用变量和大多数基本变量(除long和double之外的所有类型),读和写都是原子的 对于所有声明为volatile的变量(包括long和double变量),读写都是原子的 但与此同时,docs.oracle断言增加变量不是一个原子操作。我以为这是一篇文章: private int number; number++; 显然,我不明白“读”和“写”是什么意思 有人能解释一下,并举一个“读
- 对于引用变量和大多数基本变量(除long和double之外的所有类型),读和写都是原子的
- 对于所有声明为volatile的变量(包括long和double变量),读写都是原子的
private int number;
number++;
显然,我不明白“读”和“写”是什么意思
有人能解释一下,并举一个“读”和“写”的例子吗
编辑:在不同步的情况下执行此操作时,程序会受到线程干扰。所以我知道它不是原子的。但是,当我更改另一个变量时,它属于这些线程共享的对象——没有任何干扰。
此对象的共享变量通过一个mutator进行更改。为了实现
number++
,运行时需要
编号的当前值(读取)
编号
(写入)number
的最终值将不正确,因为该线程仍将读取原始值
如果1、2和3作为一个原子操作执行(即在完成3之前线程无法启动1),那么一切都会好起来。为了实现
number++
,运行时需要
编号的当前值(读取)
编号
(写入)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中。