为了账号安全,请及时绑定邮箱和手机立即绑定

Java并发计数器多1

Java并发计数器多1

守候你守候我 2019-03-01 10:50:44
在学习并发。尝试做一个计数器。 然后不知道为什么有时候计数会多1.有时候又不会。请问要怎样才能完成正确的计数。 public class IncrementTest { static class Counter { private AtomicInteger count = new AtomicInteger(); public void increment() { count.incrementAndGet(); } public int getCount() { return count.get(); } } static Counter c = new Counter(); static class Test implements Runnable{ public void run() { while (c.getCount() < 100){ c.increment(); } System.out.println(Thread.currentThread().getName() + ":" + c.getCount()); } } public static void main(String[] args) { Test t = new Test(); Thread test = new Thread(t); test.start(); Test t2 = new Test(); Thread test2 = new Thread(t2); test2.start(); } } 修改后的部分 private static AtomicInteger count = new AtomicInteger(); static class Test implements Runnable{ public void run() { while (count.incrementAndGet() < 10000){} System.out.println(Thread.currentThread().getName() + ":" + count); } } 但是这样子最后一个结果会多1 ....
查看完整描述

3 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

你同步跟原子性搞混了吧,static class Test implements Runnable{

    public void run() {
        while (c.getCount() < 100){
            c.increment(); -----》①
        }
        System.out.println(Thread.currentThread().getName()  + ":" + c.getCount());
    }
}这段代码出的问题,可能存在:当count为99时,A线程执行到①时(还没进行自增),线程调度器切换到B线程,这是B读取的count还是99,然后进行自增。说错了的话请指教
查看完整回答
反对 回复 2019-03-01
?
达令说

TA贡献1821条经验 获得超6个赞

建议使用AtomicInteger 的 incrementAndGet方法
因为,如果两个线程同时执行到while (c.getCount() < 100)的时候,就会出现最后两个线程都执行了+1的操作。
使用incrementAndGet可以保证increse和get两个操作的线程安全

查看完整回答
反对 回复 2019-03-01
?
慕田峪9158850

TA贡献1794条经验 获得超8个赞

同意楼上的说法

查看完整回答
反对 回复 2019-03-01
  • 3 回答
  • 0 关注
  • 464 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号