原子性、可见性和有序性

目录

原子性

可见性

有序性


原子性

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

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来保证线程能够线性执行代码。

你可能感兴趣的:(android)