Java并发计数器多1
本文介绍了Java并发计数器多1的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
在学习并发。尝试做一个计数器。 然后不知道为什么有时候计数会多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 ....
解决方案
你同步跟原子性搞混了吧,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,然后进行自增。说错了的话请指教
这篇关于Java并发计数器多1的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文