Java常见原子性操作

2023-12-19 23:08:10

在Java语言中,对基本数据类型的变量读取赋值操作都是原子性的,对引用类型的变量读取和赋值的操作也是原子性的,因此诸如此类的操作是不可被中断的,要么执行,要么不执行,正所谓一荣俱荣一损俱损。

原子操作

x=10;赋值操作是原子操作

非原子操作

y=x;赋值操作 非原子性的,因为它包含如下两个重要的步骤。
1)执行线程从主内存中读取x的值
2)在执行线程的工作内存中修改y的值为x,然后将y的值写入主内存之中。


y++;自增操作 这条操作语句是非原子性的,因为它包含三个重要的步骤,
1)执行线程从主内存中读取y的值。
2)在执行线程工作内存中为y执行加1操作。
3)将y的值写入主内存。

z=z+1;加一操作(与自增操作等价)

综合上面的四个例子,我们可以得出以下几个结论。
1、多个原子性的操作在一起就不再是原子性操作了。
2、简单的读取与赋值操作是原子性的,将一个变量赋给另外一个变量的操作不是原子性的。
3、Java内存模型只保证了基本读取和赋值的原子性操作,其他的均不保证,如果想要使得某些代码片段具备原子性,需要使用关键字 synchronized,或者JUC中的 lock。如果想要使得int等类型自增操作具备原子性,可以使用JUC包下的 原子封装类型java.util.concurrent.atomic.*

-----------------------------------------------------------------------------读书笔记摘自 书名:Java高并发编程详解:多线程与架构设计 作者:汪文君

文章来源:https://blog.csdn.net/weixin_37646636/article/details/135092971
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。