https://blog.csdn.net/xueping_wu/article/details/124541419
volatile
- 为数据提供了可见性
保证每次线程执行的时候都重新读取 - 让编译器不再优化这部分代码
指令都不再重新编排 - 为了保证原子性需要对方法使用
synchronized
关键字加锁
AtomicInteger
- 保证了数据的原子性,即数据在执行多个指令时不会被抢断
DCL 双端检测机制
即在加锁前
和加锁后
,主体代码执行之前都对锁进行判断
第一次加锁是确认加锁是否被允许,如果允许则加锁
加锁后再次判断,可能会有别的线程在我们执行加锁前修改了数据
例子:
// DCL(Double Check Lock双端检锁机制)
if (instance == null) { // a行
synchronized (SingletonDemo.class) {
if (instance == null) { // b行
instance = new SingletonDemo(); // c行
}
}
}
return instance;