java asm源码分析_探究CAS原理(基于JAVA8源码分析)

比较并替换,实现并发算法时常用到的一种技术,在java同步器中大量使用了CAS技术,神奇的实现了多线程执行的安全性

思想很简单:三个参数一个当前内存值V

旧的预期值A

即将更新的值B

当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做,并返回false。

问题

一个n++的问题。public class Case {    public volatile int n;    public void add() {

n++;

}

}

通过javap -verbose Case看看add方法的字节码指令public void add();

flags: ACC_PUBLIC

Code:

stack=3, locals=1, args_size=1

0: aload_0

1: dup

2: getfield      #2                  // Field n:I

5: iconst_1

6: iadd

7: putfield      #2                  // Field n:I

10: return

n++被拆分成了几个指令:

执行getfield拿到原始n;

执行iadd进行加1操作;

执行putfield写把累加后的值写回n;

通过volatile修饰的变量可以保证线程之间的可见性,但并不能保证这3个指令的原子执行,在多线程并发执行下,无法做到线程安全,得到正确的结果,那么应该如何解决呢?

如何解决

在add方法加上synchronized修饰解决。public class Case {    public volatile int n;    public synchronized void add() {

n++;

}

}

这个方案当然可行,但是性能上差了点,还有其它方案么?

再来看一段代码

public int a = 1;

public boolean compareAndSwapInt(int b) {

if (a == 1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值