多线程内存可见性

Java多线程之内存可见性

一曲冷凌霜 提交于 2019-12-06 03:31:30
Java内存模型( JMM ) : 1) 所有的变量都存储在主内存中 2) 每个线程都有自己独立的工作内存, 里面保存该线程使用到的变量的副本 ( 主内存中该变量的一份拷贝 ) JMM 两条规定: 1) 线程对共享变量的所有操作都必须在自己的工作内存中进行 2) 不同线程之间无法直接访问其他线程工作内存中的共享变量, 线程间共享变量值的传递必须通过主内存 线程间共享变量可见性实现的原理: 线程A 对共享变量的修改想被线程B 及时看到, 必须要经过以下2个步骤: 1) 把线程A 工作内存中更新过的共享变量刷新到主内存中 ( store ) 2) 将主内存中最新的共享变量的值共享到线程B 工作内存中 ( load ) Java 语言层面支持的可见性实现方式: 1) synchronized 2) volatile JUC 包下的类也可以实现可见性 1) Atomic 2) ReentrantLock 3) Semaphore 1. synchronized 实现可见性 JMM 关于 synchronized 的两条规定: 1) 线程释放锁前, 必须把共享变量的最新值从该线程的工作内存刷新到主内存中 2) 线程持有锁时, 将清空该线程工作内存中共享变量的值, 从主内存中读取最新的值 synchronized 实现可见性的原因: 线程释放锁前对共享变量的修改在下次持有锁时对其他线程可见