首页 > 其他分享 >Unsafe.compareAndSwapLong方法

Unsafe.compareAndSwapLong方法

时间:2023-11-15 17:01:30浏览次数:23  
标签:CompareAndSwapLongExample long Unsafe unsafe value compareAndSwapLong 方法

compareAndSwapLong方法是一个原子操作,通常用于并发编程中的无锁算法。它的作用是以原子比较方式比较并交换某个对象的一个long类型的字段。4个参数:

1.Object obj:需要操作的对象。

2.long offse:obj中要操作的字段的内存偏移量。

3.long expected:预期的值,用于比较。

4.long updated:要更新的值。

compareAndSwapLong方法首先会比较obj中偏移量为offset的字段的当前值与expected是否相等。如果相等,说明没有其他线程修改过这个字段的值,那么方法会将该字段更新为updated值,并返回true。如果不相等,说明其他线程可能已经修改过这个字段的值,那么方法不做任何操作,并返回false。

这个方法通常与Unsafe类一起使用,这是一个用于低级操作的类。它允许直接操作Java对象的内存,包括获取和设置字段的值、分配和释放内存等。

compareAndSwapLong方法通常用于实现高性能的并发数据结构,如AtomicLong、ConcurrentHashMap等。

import sun.misc.Unsafe;
 
import java.lang.reflect.Field;

public class CompareAndSwapLongExample {

  private static Unsafe unsafe;
  private static long valueOffset;
  private long value;
  
  static{
    try{
      //获取unsafe实例
      Field unsafeField  = Unsafe.class.getDeclaredField("theUnsafe");
      unsafeField.setAccessible(true);
      unsafe = (Unsafe)unsafeField.get(null);
      
      //获取value字段的内存偏移量
      valueOffset = unsafe.objectFieldOffset(CompareAndSwapLongExample.class.getDeclaredField("value"));
      
    }catch (NoSuchFieldException | IllegalAccessException e){
      e.printStackTrace();
  }
    
   
    public boolean compareAndSet(long expected,long updated){
    	return unsafe.compareAndSwapLong(this,valueOffset,expected,updated);
    }
    
    public void increment(){
    	long oldValue;
      long newValue;
      
      do{
      	oldValue = value;
        newValue = oldValue + 1;
      }while(!compareAndSet(oldValue,newValue));
  
    }
 
    
    public static void main(String[] args) {
        CompareAndSwapLongExample example = new CompareAndSwapLongExample();
        for (int i = 0; i < 10; i++) {
            example.increment();
            System.out.println("value: " + example.value);
        }
    }
}


标签:CompareAndSwapLongExample,long,Unsafe,unsafe,value,compareAndSwapLong,方法
From: https://blog.51cto.com/u_11315052/8398798

相关文章

  • 性能理论-软件性能测试方法论(四)
    软件性能测试方法论性能测试方法主要包括SEI负载测试计划过程和RBI方法。1.SEI负载测试计划过程SEI负载测试计划过程(SEILoadTestingPlanningProcess)是一个关注于负载测试计划的方法,其目标是产生清晰、易理解、可验证的负载测试计划。SEI负载测试计划过程包括6个......
  • vscode编写js canvas无代码提示的解决方法
    解决方法:如果是2d上下文,则在获取上下文的前一句加上/**@type{CanvasRenderingContext2D}*/如果是3d上下文,则加上/**@type{WebGLRenderingContext}*/letdrawing=document.querySelector("#canvas")if(drawing.getContext){/**@type......
  • Java开门方法怎么调用关锁方法
    在Java中,如果你想要调用一个方法来锁定门(假设是一个类的方法),你首先需要有一个表示门的类,并且这个类中应该包含开门和关门的方法。这里是一个简单的例子:publicclassDoor{ //开门的方法publicvoidopen(){System.out.println("Doorisopened.");} //关门的方法pu......
  • vue3 子组件修改父组件的两种方法
    <jdy-goods-attr:goods_sn="goods.goods_sn"@goods_sn="(msg)=>goods.goods_sn=msg"v-model:goods_num="goods.goods_num"></jdy-goods-attr>constemit=defineEmits(['goods_sn',�......
  • WSL+ vscode 编程方法记录
    WSL的终端可以安装zsh,使用起来体验感比CMD好太多了,再加上环境配置要方便很多,所以这里记录一下开发的流程和注意事项。这里使用conda控制不同的Python环境,进行日常代码工作。还可以使用Docker实现更加严格和规范的环境配置。Windows图形界面查看WSL中的文件:方法1:资......
  • 20231109 我如何看待命题:计算机不能解决那些计算机外部世界无解决方法的问题
    “解释为什么计算机不能解决那些计算机外部世界无解决方法的问题”是《计算机科学导论》第一章的第一道课后习题,以下是我的回答:在2023年的今天,我并不完全认同这个问题预设的命题,即“计算机不能解决那些计算机外部世界无解决方法的问题”(以下简称“命题A”)。1、什么是“计算机”......
  • 振弦传感器钢筋计埋设与安装方法
    振弦传感器钢筋计埋设与安装方法振弦传感器是一种常用的钢筋计测量设备,它通过测量钢筋振动的频率和振幅来判断钢筋的应力状态和疲劳程度,从而实现对钢筋的检测和监测。振弦传感器的钢筋计埋设和安装是使用该设备的关键步骤,下面将详细介绍其方法。 1.前期准备在进行埋设和安......
  • 振弦传感器钢筋计埋设与安装方法
    振弦传感器钢筋计埋设与安装方法振弦传感器是一种常用的钢筋计测量设备,它通过测量钢筋振动的频率和振幅来判断钢筋的应力状态和疲劳程度,从而实现对钢筋的检测和监测。振弦传感器的钢筋计埋设和安装是使用该设备的关键步骤,下面将详细介绍其方法。前期准备在进行埋设和安装之前,需要做......
  • static、final、private是否可以修饰抽象方法?
    1、static和abstract:是不能共存的。static是为了方便调用,abstract是为了给子类重写,没有方法体。2、final和abstract:是互相冲突的,final修饰的方法不能重写,而abstract修饰的方法就是为了让子类重写的。3、private和abstract:也是冲突的,private修饰的方法不能被继承,也就是不能够被重......
  • 04_委托的使用_回调方法
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespace_04_委托的使用_回调方法{classProgram{staticvoidMain(string[]args){ProductFactoryproductFactory......