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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!