并发编程-原理

93 阅读1分钟

volatile 原理

volatile 的底层实现原理是内存屏障,Memory Barrier(Memory Fence)

  • 对 volatile 变量的写指令后会加入写屏障
  • 对 volatile 变量的读指令前会加入读屏障

如何保证可见性

写屏障(sfence)保证在该屏障之前的,对共享变量的改动,都同步到主存当中

public void actor2(I_Result r) {
    num = 2;
    ready = true; // ready 是 volatile 赋值带写屏障
    // 写屏障

}

而读屏障(lfence)保证在该屏障之后,对共享变量的读取,加载的是主存中最新数据

public void actor1(I_Result r) {
    // 读屏障
    // ready 是 volatile 读取值带读屏障
    if(ready) {
        r.r1 = num + num;
    } else {
        r.r1 = 1;
    }
}

image.png

如何保证有序性

image.png

image.png

image.png

还是那句话,不能解决指令交错:

  • 写屏障仅仅是保证之后的读能够读到最新的结果,但不能保证读跑到它前面去
  • 而有序性的保证也只是保证了本线程内相关代码不被重排序

image.png

double checked locking问题

double checked locking解决

final 原理

设置final变量的原理

image.png

获取final变量的原理

Monitor 原理

image.png

image.png

synchronized 原理

进阶

轻量级锁

锁膨胀

自旋优化

偏向锁

锁消除

wait notify 原理

image.png

join 原理

image.png

image.png

park unpark 原理

AQS 原理

ReentrantLock 原理

读写锁原理