1.2.2 线程安全之原子性操作

2019-11-16  本文已影响0人  MichealDiao

什么是原子操作

一个或若干个操作看成一个整体,要不全不执行要不全部不执行

可见性问题和原子性问题的区别

这些问题产生的原因

  1. 因为CPU高速缓存
  2. 因为线程的独占内存和主内存的关系:所有的变量都在主内存有一份原件,每个线程运行的时候会去主内存拷贝一份,如果线程对变量有修改的话,就把最新的值同步到主内存,这就导致之间会有线程不安全的问题
  3. 指令重排,jit编译(运行时编译)会对代码进行优化,譬如
while(flag){}

在经历了N次循环后,编译器会认为永远都不会等于0,然后优化成

if(flag==true)
{
  while(true){}
}

解决可见性问题的方法:volatile

  1. 用volatile关键字描述的变量,虽然仍然会在线程的独占内存里有一份拷贝,但是每次读取之前,仍然会去主内存读取一次
  2. 使用了volatile修饰的变量,相关的代码不会进行指令重排。

CAS COMPARED AND SWAP 比较与交换

这是硬件级别的用来解决原子性问题的一个方法,它需要两个值

UNSAFE JVM级别的CAS工具类

AtmoicInteger、AtmoicIntegerArray、AtmoicReferenceArray之类的

上一篇 下一篇

猜你喜欢

热点阅读