只需運行代碼很多次,並且這些幸運時間之一您將能夠看到線程干擾的行動。
這種情況很少見,因爲它的一個小程序並沒有太多的事情發生。如果你做多個遞增和遞減線程,線程干擾將更容易觀察。
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方法給出正確的答案。試試看。