Javaマルチスレッドがリソースロック同期に無効な理由は何ですか?
1680 ワード
public class IncrementAndDecrement {
private static Integer balance=0;//
/**
* @param args
*/
public static void main(String[] args) {
ExecutorService executor=Executors.newCachedThreadPool();
executor.execute(new IncrementTask());
executor.execute(new DecrementTask());
executor.execute(new DecrementTask());
executor.execute(new IncrementTask());
executor.shutdown();
while(!executor.isTerminated()){
}
System.out.println("balance="+balance);
}
/**
*
* @author Administrator
*
*/
private static class IncrementTask implements Runnable{
public void run(){
synchronized(balance){
int newBalance=balance+1;
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
balance=newBalance;
}
}
}
/**
*
*/
private static class DecrementTask implements Runnable{
public void run(){
synchronized(balance){
int newBalance=balance-1;
try {
Thread.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
balance=newBalance;
}
}
}
}
プログラムが実現したい効果は,共有リソース(Integerタイプのbalance)に対して増加と減少の操作を行い,増加と減少はそれぞれ2つのスレッドタスクによって実行される.2つのスレッドタスククラスでは、増加または減少するときにsynchronizedキーワードを使用してリソース(balance)をロックします.しかし、実行の結果、同期は実現しなかった.何が原因なのか疑問です.さらに、増減操作をメソッドにカプセル化し、synchronizedで記述した場合、実行結果は同期されます.Y ?