研究AbstractQueuedSynchronizer源码的时候,发现jdk1.8与jdk9以上的实现不太一样
    jdk1.8使用的是unsafe的内置方法来提供CAS操作:
    image.png
    而jdk9以上则使用VarHandle:
    image.png
    image.png
    VarHandle(变量句柄)提供了许多原子操作用来替换原先的Unsafe类型,因为Unsafe顾名思义就是不安全的,该类型并不是针对开发者开放的,并不建议开发者使用,以免造成安全性问题。而VarHandle恰恰就是提供给开发者使用的。
    使用方法也不算复杂我们看下AQS的源码,通过MethodHandles.Lookup来获取该句柄,然后就可以直接使用了。
    image.png
    image.png
    VarHandle提供多个原子性操作来替换之前Unsafe中的方法,比如上面的compareAndSet替换Unsafe中的compareAndSetInt等
    image.png