20230615 java.lang.invoke.VarHandle
介绍
- java.lang.invoke.VarHandle
- public abstract class VarHandle implements Constable
- 在并发编程和底层内存访问上提供了一种更为灵活、安全和高效的方式
API
-
get , set
- 保证原子性
-
getVolatile , setVolatile
- 保证可见性
-
getOpaque , setOpaque
- 保证有序性
- opaque 不透明的
-
getAcquire
- 保证原子性和有序性
- 插入一个 Acquire 栅栏
-
setRelease
- 保证写操作对于之后的读操作是可见的
- 在执行写操作后插入 Release 栅栏
-
compareAndSet
- 原子性操作
boolean compareAndSet(Object... args);
-
compareAndExchange
Object compareAndExchange(Object... args);
-
compareAndExchangeAcquire
-
compareAndExchangeRelease
-
weakCompareAndSetPlain
-
weakCompareAndSet
-
weakCompareAndSetAcquire
-
weakCompareAndSetRelease
-
getAndSet
-
getAndSetAcquire
-
getAndSetRelease
-
getAndAdd
-
getAndAddAcquire
-
getAndAddRelease
-
getAndBitwiseOr
-
getAndBitwiseOrAcquire
-
getAndBitwiseOrRelease
-
getAndBitwiseAnd
-
getAndBitwiseAndAcquire
-
getAndBitwiseAndRelease
-
getAndBitwiseXor
-
getAndBitwiseXorAcquire
-
getAndBitwiseXorRelease
-
hasInvokeExactBehavior
-
withInvokeExactBehavior
-
withInvokeBehavior
-
varType
-
coordinateTypes
-
accessModeType
-
isAccessModeSupported
-
toMethodHandle
-
fullFence
-
acquireFence
-
releaseFence
-
loadLoadFence
-
storeStoreFence
代码理解
Acquire 和 Release 栅栏
Acquire 和 Release 栅栏是一种同步机制,都是为了保证多线程并发操作的正确性和可见性。
Acquire 和 Release 栅栏可以被看做是一对锁的半对,所谓的锁的半对是指只有 Acquire 或 Release 中的一个生效,并不需要两个同时生效,也就是说在访问某个共享变量时,如果要使用栅栏机制,只需在读写变量时对应地加上一个 Acquire 或 Release 的栅栏即可。
在程序中,Acquire 和 Release 栅栏的作用如下:
-
Acquire 栅栏:对于一个数据变量, Acquire 栅栏用于确保变量的变化对于其他线程的可见性。它先确保本线程的所有普通写操作都先行发生,再将该线程的写缓冲区的数据刷新到内存中,最后,该栅栏强制后续的读操作必须从主内存中读取数据变量的最新值。也就是说,Acquire 栅栏保证了当前线程所做的写操作对后续的读操作可见,它是一种获取其他线程所做的修改的机制。
-
Release 栅栏:对于一个数据变量, Release 栅栏用于确保该变量的变化对于其他线程的可见性。它先将当前线程的写操作刷新到内存中,再让该变量的所有写操作对其他线程可见。也就是说,Release 栅栏保证了当前线程的所有写操作对其他线程是可见的,它是一种发布当前线程的修改的机制。
综上所述,Acquire 和 Release 栅栏都是为多线程并发操作提供保证的机制,能够保证共享变量的可见性和正确性。在具体实现时,根据场景不同,可以选择使用 Acquire 或 Release 栅栏,也可以同时使用这两种栅栏来保证多线程的正确性和可见性。