我觉得,他想说明的是
      accounts[from] -= amount;
      accounts[to] += amount;
      ntransacts++;
临界资源需要synchronized进行访问,要不然就会出现异常。
但是,结果为什么和预想的不符合,开始我也有点奇怪呢?
我把
        {  int toAccount = 3;//(int)(bank.size() * Math.random());
            int amount = 500;//(int)(maxAmount * Math.random());还原成:    {  int toAccount = (int)(bank.size() * Math.random());
            int amount = (int)(maxAmount * Math.random());在win2000,单cpu台式机上访问时,出现的情况,和你贴的相同。后来我在一台sun的e250上,双cpu又测试了2把:
--------------------------------
1.结果
Transactions:10000 Sum: 96194
Transactions:20000 Sum: 91947
Transactions:30000 Sum: 99124
Transactions:40002 Sum: 98146
Transactions:50000 Sum: 98146
Transactions:60000 Sum: 94375
Transactions:70000 Sum: 88151
Transactions:80001 Sum: 87613
Transactions:90000 Sum: 76541
Transactions:100000 Sum: 70845
Transactions:110001 Sum: 70845--------------------------------
2.结果:
Transactions:10000 Sum: 100000
Transactions:20001 Sum: 93549
Transactions:30000 Sum: 93549
Transactions:40001 Sum: 88155
Transactions:50000 Sum: 85862
Transactions:60000 Sum: 87284
Transactions:70001 Sum: 79476
Transactions:80002 Sum: 79476
Transactions:90000 Sum: 92392
Transactions:100003 Sum: 93955
Transactions:110003 Sum: 93993--------------------------------
结论,在单cpu的状态下,线程并不能形成真正的并发处理,它只是对cpu时间段的调度,再加上对临界资源处理所需的时间比较少,没有出现不同步的问题;在双cpu下,就出现的不同步访问临界资源的问题。good luck!