synchronized内存语义
锁释放与获取 hanppens-before关系
class Demo {
int a = 0;
public synchronized void writer() { //1 线程获取锁
a++; //2 执行逻辑操作
} //3 线程释放锁
public synchronized void reader() { //4 线程获取锁
int b = a; //5 执行操作逻辑
} //6 线程释放锁
}
假设一个线程先调用writer在调用reader,happens-before关系为
- 1 happens-before 2
- 2 happens-before 3
- 4 happens-before 5
- 5 happens-before 6
- 根据监视器锁规则 一个锁的释放 happens-before 之后对该锁的获取,3 happens-before 4
- 根据传递性规则,2 happens-before 5,所以b为1
锁释放与获取 内存语义
锁释放
- 锁释放时,JMM会将当前线程本地内存所有共享变量刷新至主内存
锁获取
- 锁获取时,JMM会将当前线程本地内存所有共享变量设置为无效,重新从主内存读取