引出
Java多线程——synchronized、volatile 保障可见性
synchronized、volatile 保障可见性
- 原子性:在一次或者多次操作时,要么所有操作都被执行,要么所有操作都不执行。
- 可见性:当一个线程对共享变量进行修改后,另外一个线程可以立即看到该变量修改后的最新值。
- 有序性:程序执行的顺序按照代码的先后顺序执行。
synchronized
关键字和Lock
相关的工具类可以保证原子性、可见性和有序性,volatile
关键字可以保证可见性和有序性,不能保证原子性。
可见性:synchronize、volatile
原子性:synchronize
volatile保证数据的可见性,但是不保证原子性(多线程进行写操作,不保证线程安全);而synchronized是一种排他(互斥)的机制。
主线程无法感知t1线程修改了flag值:
private static Boolean flag = false;
public static void main(String[] args) throws Exception {
Thread t1 = new Thread(()->{
try {
Thread.sleep(2000);
} catch (InterruptedException e)