运行多次输出结果都不一样,请知道的前辈解释下整个程序流程和可能的输出,不胜感激~~
 
public class Transfers {
 public static void main(String[] args) throws Exception {
 Record r1 = new Record();
 Record r2 = new Record();
 
 doTransfer(r1, r2, 5);
 
 doTransfer(r2, r1, 2);
 
 doTransfer(r1, r2, 1);
 
 System.out.println("rl = " + r1.get() +", r2=" + r2.get());
 }
 private static void doTransfer(final Record a, final Record b, final int amount) {
 Thread t = new Thread() {
 public void run() {
 new Clerk().transfer(a, b, amount);
 }
 };
 
 t.start();
 }
}
 
class Clerk {
public  void transfer(Record a, Record b, int amount){
synchronized (a) {
synchronized (b) {
a.add(-amount);
b.add(amount);
}
}
}
}
 
class Record {
int num=10;
public int get() { return num; }
public void add(int n) { num = num + n; }
}

解决方案 »

  1.   

    程序没有任何问题,运行结果也是正确的。 
    你所谓的输出结果每次不同,是因为你没有等前三个线程运行完毕,就显示的问题,我调整了代码,你看一下就知道了
    public class Transfers {
      public static void main(String[] args) throws Exception {
        Record r1 = new Record();
        Record r2 = new Record();
        doTransfer(r1, r2, 5);
        doTransfer(r2, r1, 2);
        doTransfer(r1, r2, 1);
        Thread.sleep(2000);
        System.out.println("rl   =   " + r1.get() + ",   r2=" + r2.get());
      }  private static void doTransfer(final Record a, final Record b, final int amount) {
        Thread t = new Thread() {
          public void run() {
            new Clerk().transfer(a, b, amount);
          }
        };
        t.start();
      }
    }class Clerk {
      private static final Object lock = new Object();  public void transfer(Record a, Record b, int amount) {
        synchronized (lock) { // 这里恢复你的 synchronized (a) { 也可以,不过输出比较乱,但结果依然正确
          System.out.println("B Froml   =   " + a.get() + ",  To2=" + b.get());
          a.add(-amount);
          b.add(amount);
          System.out.println("E Froml   =   " + a.get() + ",  To2=" + b.get());
        }
      }
    }class Record {
      int num = 10;  public int get() {
        return num;
      }  public void add(int n) {
        num = num + n;
      }
    }你看一下输出结果就知道了,完全按照你要求的进行。