加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – AtomicInteger如何工作?

发布时间:2020-12-15 08:45:18 所属栏目:Java 来源:网络整理
导读:我不认为穿线会是这种困难的叹息. 无论如何,我想到在线程完成后执行函数的唯一方法是使用静态计数器在线程运行时递增. if(++threadcounter==3){doSomething(); threadcounter =0;} 我发现这不是一个好主意,因为线程计数器有时从未达到4. 所以我用了原子整数
我不认为穿线会是这种困难的叹息.
无论如何,我想到在线程完成后执行函数的唯一方法是使用静态计数器在线程运行时递增.

if(++threadcounter==3){doSomething(); threadcounter =0;}

我发现这不是一个好主意,因为线程计数器有时从未达到4.

所以我用了原子整数

if(atomicint.incrementAndGet()==4){doSomething(); atomicint.set(0);}

计数器为5或0,应用程序冻结.我不知道发生了什么.如何使用正确的计数器?
?谢谢

编辑:

解决方法

解决这个问题的最简单方法是使用一个很好的老式锁:

boolean shouldDoSomething;
synchronized {
    ++threadCounter;
    if (threadCounter == 4) {
        threadCounter = 0;
        shouldDoSomething = true;
    }
    else {
        shouldDoSomething = false;
    }
}
if (shouldDoSomething) doSomething();

这将在锁上产生争用,但会在一段非常非常简短的代码中产生争用 – 一个加载,一个存储和一些算术指令.

您对AtomicInteger的使用是错误的,因为没有锁定或其他并发控制链接incrementAndGet和集合,这意味着存在潜在的竞争条件(值为3,线程A递增为4,线程B递增为5,线程A设为0).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读