上锁前
package gcallable;
public class UnsafeBank {
public static void main(String[] args) {
Amount amount = new Amount(500, "基金");
Drawing you = new Drawing(amount, 50, "我");
Drawing girl = new Drawing(amount, 60, "老婆");
you.start();
girl.start();
}
}
class Amount {
int money;
String name;
public Amount(int money, String name) {
super();
this.money = money;
this.name = name;
}
}
class Drawing extends Thread{
Amount amount;
int Drawingmoney;
int Nowmoney;
String name;
public Drawing(Amount amount, int drawingmoney, String name) {
super();
this.amount = amount;
Drawingmoney = drawingmoney;
this.name = name;
}
@Override
public void run() {
if (amount.money-Drawingmoney<0) {
System.out.println(Thread.currentThread().getName()+"钱不够,取不了");
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
amount.money=amount.money-Drawingmoney;
Nowmoney=Nowmoney+Drawingmoney;
System.out.println(amount.name+"余额:"+amount.money);
System.out.println(this.getName()+"手里的钱:"+Nowmoney);
}
}
基金余额:440
基金余额:440
Thread-1手里的钱:60
Thread-0手里的钱:50
上锁后
package gcallable;
public class UnsafeBank {
public static void main(String[] args) {
Amount amount = new Amount(500, "基金");
Drawing you = new Drawing(amount, 50, "我");
Drawing girl = new Drawing(amount, 60, "老婆");
you.start();
girl.start();
}
}
class Amount {
int money;
String name;
public Amount(int money, String name) {
super();
this.money = money;
this.name = name;
}
}
class Drawing extends Thread{
Amount amount;
int Drawingmoney;
int Nowmoney;
String name;
public Drawing(Amount amount, int drawingmoney, String name) {
super();
this.amount = amount;
Drawingmoney = drawingmoney;
this.name = name;
}
@Override
public void run() {
synchronized (amount) {
if (amount.money-Drawingmoney<0) {
System.out.println(Thread.currentThread().getName()+"钱不够,取不了");
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
amount.money=amount.money-Drawingmoney;
Nowmoney=Nowmoney+Drawingmoney;
System.out.println(amount.name+"余额:"+amount.money);
System.out.println(this.getName()+"手里的钱:"+Nowmoney);
}
}
}
基金余额:450
Thread-0手里的钱:50
基金余额:390
Thread-1手里的钱:60
在run()里面对amount上锁