在看JUC包下源码时看到很多内容都是以底层的unsafe方法实现,同时看到很多final的valueOffset、stateOffset等属性在一个静态代码块中被方法unsafe.objectFieldOffset赋值,就查了下这个方法。作用是获取某个字段相对Java对象在内存中的“起始地址”的偏移量,同时unsafe提供了根据这个偏移量值访问(读&写)某字段的方法。这样就不难理解为何字段直接设置为final但是还能够修改其中内容了,它是直接绕过了final限制对内存进行操作的,同时也避免了开发者的Java程序对其进行修改。同样的,为了达成CAS底层的绝对原子操作,unsafe.compareAndSwapInt等方法也是这样直接操作内存数据,并且这个过程会判断若是多核CPU环境则会进行锁总线以保证原子性,否则忽略lock操作。
Java 底层native库原理探究
最新推荐文章于 2021-02-27 18:30:24 发布