请看如下代码:
开启两个线程对count执行加运算,按道理两个线程运行完以后,count不是应该加了2000000次吗?怎么结果打印没有200000呢?public class ThreadDemo { class RunnableImpl implements Runnable{
int count=0;
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<100000;i++){
count++;
System.out.println(Thread.currentThread().getName()+":"+count);
}
}
}
public static void main(String[] args) {
ThreadDemo demo=new ThreadDemo();
RunnableImpl impl=demo.new RunnableImpl();
Thread t1=new Thread(impl,"线程1");
Thread t2=new Thread(impl,"线程2");
t1.start();
t2.start();
}
}多试几次,结果都不尽相同,反正想了解为什么结果count没有200000.
高手请指教!
开启两个线程对count执行加运算,按道理两个线程运行完以后,count不是应该加了2000000次吗?怎么结果打印没有200000呢?public class ThreadDemo { class RunnableImpl implements Runnable{
int count=0;
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<100000;i++){
count++;
System.out.println(Thread.currentThread().getName()+":"+count);
}
}
}
public static void main(String[] args) {
ThreadDemo demo=new ThreadDemo();
RunnableImpl impl=demo.new RunnableImpl();
Thread t1=new Thread(impl,"线程1");
Thread t2=new Thread(impl,"线程2");
t1.start();
t2.start();
}
}多试几次,结果都不尽相同,反正想了解为什么结果count没有200000.
高手请指教!
在某一时刻,两个进程同时对count加一,加之前count假设是20,加一之后就是21
本该是22的,但是结果就是21,以后也有可能发生类似事件,所以造成结果不是200000,而且结果肯定不大于200000
不是说cpu对线程的调度遵循时间片轮转原则,在某一时刻只是一个线程在运行吗?那怎么会出现两个线程同时对count加一呢?
或许是这样吧,可是我就是想搞清楚为什么把count++交给两个线程去做,就不会有200000呢?能详细点告诉吗?谢了。
for(int i=0;i<100000;i++){//打个比方,当i等于100时,这个条件两个线程是不是可以同时满足?
线程1比较积极,先执行了i++语句。变成101。线程2开了个小差,又执行了一把i++。这无形中就少了一次循环
count++;
System.out.println(Thread.currentThread().getName()+":"+count);
}
count++;
System.out.println(Thread.currentThread().getName()+":"+count);
}
}
// ...
// int count=0;
AtomicInteger count = new AtomicInteger(0);
// ...
// count++;
count.getAndIncrement();
// System.out.println(Thread.currentThread().getName()+":"+count);
System.out.println(Thread.currentThread().getName()+":"+count.get());
因为两个线程在操作同一个变量啊