首页 > 编程语言 >20230615 java.lang.invoke.VarHandle

20230615 java.lang.invoke.VarHandle

时间:2023-08-22 17:44:19浏览次数:42  
标签:lang 栅栏 java 变量 Acquire 线程 Release 操作 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 栅栏,也可以同时使用这两种栅栏来保证多线程的正确性和可见性。

标签:lang,栅栏,java,变量,Acquire,线程,Release,操作,VarHandle
From: https://www.cnblogs.com/huangwenjie/p/17649195.html

相关文章

  • 20230615 java.lang.ThreadLocal
    介绍java.lang.ThreadLocalpublicclassThreadLocal线程局部变量APIstatic方法withInitial<S>ThreadLocal<S>withInitial(Supplier<?extendsS>supplier)创建一个线程局部变量,其初始值通过调用给定的supplier生成public方法get得到这个线程的当前值......
  • java应用接口自动化覆盖率统计实践
    一、背景Java应用接口自动化覆盖率统计的意义在于:确保测试覆盖率:通过自动化覆盖率统计,可以确保测试用例对应用程序的各个接口进行了全面的覆盖。这有助于发现潜在的代码错误、逻辑漏洞或者未处理的异常情况。提高代码质量:通过自动化覆盖率统计,可以发现代码中未被测试到的部......
  • java-sdk接口测试覆盖率统计实践
    一、背景接口覆盖率统计在JavaSDK开发中具有重要的意义。它衡量了代码中接口被测试用例覆盖的程度,即测试用例对接口的执行情况进行了多少次验证。接口覆盖率统计的意义包括:质量保证:接口覆盖率统计可以帮助开发团队评估测试的全面性和质量,确保代码的正确性和稳定性。高覆盖率......
  • Java中怎么进行原子操作?
    在Java中进行原子操作,特别是替换某个属性,你可以使用AtomicReference类来实现。AtomicReference可以保证对对象引用的原子更新操作。以下是一个示例,展示如何使用AtomicReference来进行原子替换操作:javaCopycodeimportjava.util.concurrent.atomic.AtomicReference;publ......
  • java实现大文件上传技术
    ​ 1,项目调研因为需要研究下断点上传的问题。找了很久终于找到一个比较好的项目。 在GoogleCode上面,代码弄下来超级不方便,还是配置hosts才好,把代码重新上传到了github上面。 https://github.com/freewebsys/java-large-file-uploader-demo 效果: 上传中,显示进度,时间......
  • 让Android Studo 不编译某个Java文件
    有时为了调试,让某些文件暂时不需编译,这样可以排除错误带来的无法运行情况,可以在build.gradle中加入:excludes=['com.coolweather.myble/AddrInterceptor.java'],如下compileOptions{sourceCompatibilityJavaVersion.VERSION_1_8targetCompatibilityJavaVers......
  • 15 JavaScript ES6中的箭头函数
    15JavaScriptES6中的箭头函数什么是箭头函数ES6中允许使用=>来定义函数。箭头函数相当于匿名函数,并简化了函数定义。基本语法//箭头函数letfn=(name)=>{//函数体return`Hello${name}!`;};//等同于letfn=function(name){//函数体......
  • Javascript关于对象的理解
    对象的概念  对象是一个包含数据和方法的集合。  下面,我们通过实例探索对象。首先,创建一个对象varperson={};  如果在控制台输入person,将会得到 [objectObject] 这时,我们就创建了一个空的对象,接着,我们需要向空对象中添加数据或方法varperson={name:[......
  • JAVA使用Protobuf GRPC
    IDEA安装Protobuf插件引入maven依赖<dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.19.1</version></dependency>protobuf是目前比较新的版本,之前测试过程中使用3.9.1。发现生成的源代码......
  • java实现大文件上传实例解析
    ​  上周遇到这样一个问题,客户上传高清视频(1G以上)的时候上传失败。一开始以为是session过期或者文件大小受系统限制,导致的错误。查看了系统的配置文件没有看到文件大小限制,web.xml中seesiontimeout是30,我把它改成了120。但还是不行,有时候10分钟就崩了。同事说,可能是客户这......