package ThreadSafe;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Account {
private double money;
private String cardId;
private final Lock lk = new ReentrantLock();
public Account() {
}
public Account(double money, String cardId) {
this.money = money;
this.cardId = cardId;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
// public void drawMoney(int money) {
// String name = Thread.currentThread().getName();
//
// //同步代码块
// synchronized (this) {
// if(this.money >= money) {
// System.out.println(name + "来取钱成功:" + money );
// this.money -= money;
// System.out.println(name + "来取钱成功,剩余:"+ this.money);
// }else{
// System.out.println(name + "余额不足");
// }
// }
//
// }
//同步方法
// public synchronized void drawMoney(int money) {
// String name = Thread.currentThread().getName();
//
// //同步代码块
// if(this.money >= money) {
// System.out.println(name + "来取钱成功:" + money );
// this.money -= money;
// System.out.println(name + "来取钱成功,剩余:"+ this.money);
// }else{
// System.out.println(name + "余额不足");
// }
// }
//Lock锁
public void drawMoney(int money) {
String name = Thread.currentThread().getName();
lk.lock();
try {
if(this.money >= money) {
System.out.println(name + "来取钱成功:" + money );
this.money -= money;
System.out.println(name + "来取钱成功,剩余:"+ this.money);
}else{
System.out.println(name + "余额不足");
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
lk.unlock();
}
}
}
---------------------------------------------------------------------
package ThreadSafe;
public class DrawThread extends Thread{
private Account acc;
public DrawThread(Account acc,String name){
super(name);
this.acc = acc;
}
@Override
public void run() {
acc.drawMoney(100000);
}
}
-------------------------------------------------------------------
package ThreadSafe;
public class ThreadTest {
public static void main(String[] args) {
Account acc = new Account(100000,"ICBC");
new DrawThread(acc,"小明").start();//小明
new DrawThread(acc,"小红").start();//小红
}
}
05-22
9003
04-05
175