可见性、原子性和有序性

1. 问题原因

1.1 可见性

  一个线程对共享变量的修改,另一个线程可以立即看到,这称之为可见性。

  每个计算机都有多个CPU,每个CPU都有自己的高速缓存。当线程1在CPU1上对共享变量A进行修改之后,线程2在CPU2上的高速缓存不能立刻感知到A的变化。这时候线程1的操作对线程2就不具有可见性。

1.2 原子性

  我们把一个或者多个操作在CPU执行期间不被打断的特性成为原子性。

  高级程序语言的一条语句,在翻译为机器码之后,可能对应的是多个计算机指令。

  比如:Object  obj = new Object(),

  这条语句对应的机器指令为:

  1. 分配一块内存M;
  2. 将M的地址赋值给 obj;
  3. 在M上初始化 Object 对象;

  在多线程下,各个线程抢占CPU的时间分片轮流执行,可能在第二步执行完成后就切换到另一个线程2执行,此时线程2若访问 obj,则可能发生空指针异常,因为此时 obj 只是一个空对象,还未完成初始化操作;

1.3 有序性

猜你喜欢

转载自www.cnblogs.com/virgosnail/p/10470037.html
今日推荐