Javaマルチスレッドがリソースロック同期に無効な理由は何ですか?


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 ?