运行多次输出结果都不一样,请知道的前辈解释下整个程序流程和可能的输出,不胜感激~~
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; }
}
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; }
}
解决方案 »
- 关于存储过程 out参数获得 有些不明白 大家帮解释 一下
- swing的jlabel中的文字怎样才能可选中,可复制?(在运行的界面中)
- 多线程读取csv文件,然后存入数据库的注意点?高手请进来点播下我
- 编写一个方法,返回一个double型二维数组
- String arg : cmd 这是什么用法?
- 请教一个算法,一个数组 分别按从大到小 和从小到大输出
- Java 中从大文件中删除部分数据的问题
- 线程简单问题
- 大家请进来做一道SCJP认证试题!!!并说明你答案的理由!
- 有关ORACLE的JDBC连接的问题?
- 关于Generics的一道题目
- 用SWT写个程序,怎么使点击关闭时转入右下脚状态栏继续运行???
你所谓的输出结果每次不同,是因为你没有等前三个线程运行完毕,就显示的问题,我调整了代码,你看一下就知道了
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;
}
}你看一下输出结果就知道了,完全按照你要求的进行。