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 栅栏,也可以同时使用这两种栅栏来保证多线程的正确性和可见性。

posted @ 2023-08-22 17:39  流星<。)#)))≦  阅读(24)  评论(0编辑  收藏  举报