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);
// print the result
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 synchronized 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; }
}
If Transfers.main() is run, which three are true?()
A. The output may be “r1 = 6, r2 = 14”.
B. The output may be “r1 = 5, r2 = 15”.
C. The output may be “r1 = 8, r2 = 12”.
D. The code may run (and complete) with no output.
E. The code may deadlock (without completing) with no output.
F. M IllegalStateException or InterruptedException may be thrown at runtime.