介绍
- 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 栅栏,也可以同时使用这两种栅栏来保证多线程的正确性和可见性。
- VarHandle 20230615 invoke java langvarhandle 20230615 invoke java threadlocal 20230615 java lang varhandle unsafe java annotation annotationformaterror java lang 动态invoke java java lang numberformatexception getsystenantnames java lang module classformaterror nullpointerexception jfinal java lang annotation 20230707 java lang classloader 20230711 java lang