视频地址:https://www.bilibili.com/video/av95818612/

Q1 volatile 是什么?

✅ Java 提供的一种弱同步机制的关键字,确保将变量通知到其他线程

✅ 禁止指令重排序

volatile 修饰的变量不允许线程内部缓存和重排序,修饰变量时,直接实现同步到主存。

MQ源码案例

https://cdn.nlark.com/yuque/0/2021/png/576791/1618579017470-7401836e-3c5e-4472-ae87-1e11d29b7023.png

public abstract class ServiceThread implements Runnable {

	private static final InternalLogger log = InternalLoggerFactory.getLogger(RemotingHelper.ROCKETMA_REMOTING);

    private static final long JOIN_TIME = 90 * 1000;
    protected final Thread thread;
    protected volatile boolean hasNotified = false;
    protected volatile boolean stopped = false;
}

Q2 volatile 和线程同步?

对多线程应用程序,确保线程安全的规则

https://cdn.nlark.com/yuque/0/2021/png/576791/1618579273084-687ae697-4c82-4748-9090-91ef0395ee8b.png

原子性

对于单个 volatile 变量读写是保证原子性的,对多个volatile变量读写或复合操作不保证原子性

可见性

一个线程对共享数据所做的更改对其他线程可见,保证数据一致性

有序性

线程之间的操作的有效性

Q3 happens-before 原则

https://cdn.nlark.com/yuque/0/2021/png/576791/1618579558143-bff7adea-38df-4e4a-a9d7-75687d253bf4.png