只需运行代码很多次,并且这些幸运时间之一您将能够看到线程干扰的行动。
这种情况很少见,因为它的一个小程序并没有太多的事情发生。如果你做多个递增和递减线程,线程干扰将更容易观察。
class Counter {
private int c = 0;
public void increment() {c++;}
public void decrement() {c--;}
public int value() {
return c;
}
public static void main(String[] args) {
Counter x = new Counter();
Runnable r1 = new Runnable() {
@Override
public void run() {
x.increment();
}
};
Runnable r2 = new Runnable() {
@Override
public void run() {
x.decrement();
}
};
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
System.out.println(x.c);
}
}
编辑:我决定加入多线程情况下,我无法抗拒
编辑2:这是第二edit.The多线程情况,因为这是创造超出这个范围的问题问题我决定删除它。以前我正在创建一个线程数组并运行它们。相反,显示一个执行大量增量的线程和另一个执行大量递减的线程会更好。
我已经使用Thread.Sleep()导致睡眠的主线程,这将确保在两个线程完成操作后打印C.
class Counter {
private int c = 0;
public void increment() {
for (int i = 0; i < 10000; i++) {
c++;
}
}
public void decrement() {
for (int i = 0; i < 5000; i++) {
c--;
}
}
public int value() {
return c;
}
public static void main(String[] args) {
Counter x = new Counter();
Runnable r1 = new Runnable() {
@Override
public void run() {
x.increment();
}
};
Runnable r2 = new Runnable() {
@Override
public void run() {
x.decrement();
}
};
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(!(t1.isAlive() && t2.isAlive()))
System.out.println(x.c);//expected answer 5000
}
}
注意:Synchronized Increment/Decrement方法给出正确的答案。试试看。