Atomic
do while 调用类一个compareAndSwapInt,native修饰的java底层方法,核心工作内存与主内存中完全一致后在进行处理。
Atomiclong LongAdder,LongAdder分割成cell,颗粒度小,累加而成最终结果。推荐使用Atomiclong。
AtomicIntegerFieldUpdater修改类里的某个参数,这个参数需要用public volatile非static修饰。
AtomicStampReference 每次更新维护一个版本号。解决ABA问题
AtomicBoolean 原子操作,只执行一次。
synchronized
同步代码块,同步方法,作用域:同一对象,不同对象交叉执行,互不影响。
修饰静态代码块 , 类 作用域:所有对象
JVM关于synchronized的规定:
线程解锁前,必须把共享变量的最新值刷新到主内存
线程加锁时,清空工作内存中的值,重新从主内存中读取
volatile
对volatile修饰变量写操作时,写完store屏障指令,更新到主内存。
对volatile修饰变量读操作时,先load后读,从主内存读取最新值。
不具有原子性,线程不安全。具有可见性,用于flag。线程1修正flag,线程2读到flag进行操作。
volatile具有有序性,happens-before原则,对一个变量的写先行于后面对这个变量的读操作
双重检测单例模式
1.分配内存空间 2.初始化对象 3.instance指向刚分配的内存空间
2.CPU指令重排会导致3,2交换执行顺序。先进入的线程在没有初始化的时候,后来的线程直接返回对象,导致线程不安全,可以把对象用volatile修饰,防止指令重排,使之线程安全。
final
final修饰对象,引用不可变,例如map,但是可以修改map里的kv。
Collections.unmodifiableMap(map)把map复制到unmodifiableMap中,更新方法替换为异常抛出。
ImmutableList
不可变 add()会抛异常