原子性、可见性和有序性

目录

原子性

可见性

有序性


原子性

对基本数据类型变量的读取和复制操作就是原子性操作。且原子性操作是不能被中断的,为什么这么说呢?可以看下下面的例子。

x = 3;
y =x;
x++;

类似于这种,首先x=3就是一个简单的赋值语句,直接将3赋值给x。(只有一个步骤,无法被终端)

y=x就不一样了,首先需要读取x的值,然后才能将x的值赋值给y。(有两个步骤)

x++也是,先读取x的值,然后对x的值加1,最后在赋值给x。(有3个步骤)

通俗一点,一个语句只有一个操作的就是原子性操作。

可见性

可见性是指线程之间的可见性,即一个线程修改的状态对于另一个线程是可见的。(插一句,每个线程都会有自己的私有内存,一般是线程在自己的私有内存中操作变量然后写入到主存中。但是由于并不会立刻写入主存,所以就会出现各种同步的问题了)

这个时候就体现出volatile的用途了,用了volatile修饰的变量,是立刻对所有线程可见的。只要被volatile修饰过的变量会立刻更新到主存中,于是就保证了线程之间的可见性。

有序性

Java内存模型是允许编译器和处理器对指令进行重排序的。虽然重排序不会影响单线程的执行的正确性,但是会影响到多线程并发执行的正确性。这个时候可以通过volatile来保证有序性。

按照我的理解,其实这个时候的volatile已经相当于一个锁了。所谓的多线程同时操作一个变量其实是不可能的,因为CPU永远都是串行执行的。也就是说之所以改变,是以为两个线程之间的通用变量被短时间内修改了2次,造成了数据的不稳定性。

那么相应的,要保证有序性也可以通过synchronized和Lock来保证线程能够线性执行代码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值