关于CAS线程安全问题

来源:6-8 Java内存模型之线程独占部分-1

littleRita

2021-12-24

    public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
            var5 = this.getIntVolatile(var1, var2);
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

        return var5;
    }

翔仔你好,有两个问题想问一下你
第一个问题:在执行 var5 = this.getIntVolatile(var1, var2);后,this.compareAndSwapInt(var1, var2, var5, var5 + var4)前,var5会不会又被别的线程修改一次,那这时候是不是就会有问题了?

第二个问题:比如我现在要1+1,线程2抢先执行成功了,现在内存的值应该是2,那当前线程1没有成功执行this.compareAndSwapInt(var1, var2, var5, var5 + var4),那就会一直循环,但是这时候var2,就是第一次获取的内存的值,可能还是1,那就永远不可能等于var5了,那就会永远循环下去直到该进程结束吗?

麻烦翔仔解答了,周末愉快!

写回答

1回答

翔仔

2021-12-24

同学好,首先,你这个局部变量v本身就是不同线程不同的呀,并非共享变量;那前提都没成立,后面也不会被死循环了

0
1
littleRita
谢谢翔仔!
2021-12-26
共1条回复

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8442 学习 · 1872 问题

查看课程