【并发编程】--compareAndSet底层实现原理


compareAndSet实现原理

compareAndSetHead

 private final boolean compareAndSetHead(Node update) {
    return unsafe.compareAndSwapObject(this, headOffset, null, update);
}

首先,用到了unsafe类,(Unsafe类是在sun.misc包下,不属于Java标准。但是很多Java的基础类库,包括一些被 广泛使用的高性能开发库都是基于Unsafe类开发的,比如NettyHadoopKafka等;Unsafe可认为是Java中留 下的后门,提供了一些低层次操作,如直接内存访问、线程调度等)


然后调用了compareAndSwapObject这个方法

 public final native boolean compareAndSwapObject(Object var1, long var2, Object var4,
Object var5);  

这个是一个native方法

var1:需要改变的对象。

var2:偏移量(即之前求出来的headOffset的值)。

var4:期待的值。

var5:更新后的值。

整个方法的作用是如果当前时刻的值等于预期值var4,则更新为新的期望值 var5,如果更新成功,则返回

true,否则返回false;(当前线程想要修改的对象是否已经被其他线程修改,没有修改则修改为更新后的新值。)


headOffset解析:

这里传入了一个headOffset,这个headOffset是什么呢?在下面的代码中,通过unsafe.objectFieldOffset然后通过反射获取了AQS类中的成员变量,并且这个成员变量被volatile修饰的。

屏幕快照 2019-07-23 上午9.55.21.png

屏幕快照 2019-07-23 上午9.55.49.png



headOffset这个是指类中相应字段在该类的偏移量,在这里具体即是指head这个字段在AQS类的内存中相对于该

类首地址的偏移量。

一个Java对象可以看成是一段内存,每个字段都得按照一定的顺序放在这段内存里,通过这个方法可以准确地告诉 你某个字段相对于对象的起始内存地址的字节偏移。用于在后面的compareAndSwapObject中,去根据偏移量找 到对象在内存中的具体位置

这个方法在unsafe.cpp文件中,代码如下屏幕快照 2019-07-23 上午10.01.23.png



所以其实compareAndSet这个方法,最终调用的是unsafe类的compareAndSwap,这个指令会对内存中的共享数 据做原子的读写操作。


  1. 首先, cpu会把内存中将要被更改的数据与期望值做比较
  2. 然后,当两个值相等时,cpu才会将内存中的对象替换为新的值。否则,不做变更操作
  3. 最后,返回操作执行结果
    很显然,这是一种乐观锁的实现思路。
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值