import java.util.concurrent.locks.ReentrantLock;
class Blank implements Runnable {
private int balance;
private ReentrantLock lock = new ReentrantLock();
private Demo0 dm = new Demo0();
public Blank() {
}
public Blank(int balance) {
this.balance = balance;
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
@Override
public void run() {
lock.lock();//用synchronized修饰代码块等价于synchronized(this)
// public synchronized void run()
synchronized (this) {
int num = getBalance();
if (balance >= 200) {
System.out.println("正在出钞,请稍等");
num -= 200;
// 正在出钞,请稍等
// 请取走你的钞票
// 你的余额为800
// 正在出钞,请稍等
// 请取走你的钞票
// 你的余额为600
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("请取走你的钞票");
setBalance(num);
} else {
System.out.println("余额不足");
}
System.out.println("你的余额为" + num);
lock.unlock();
}
}
}
public class DemoAccount {
public static void main(String[] args) {
Blank blank = new Blank(1000);
Thread t1 = new Thread(blank);
t1.start();
Thread t2 = new Thread(blank);
t2.start();
}
}
class Demo0 {
//正常枷锁不加static 修饰
//
// 正在出钞,请稍等
// 正在出钞,请稍等
// 请取走你的钞票
// 请取走你的钞票
// 你的余额为800
// 你的余额为800
//static 修饰表示隶属于类层级,所有共享同一个对象
// 正在出钞,请稍等
// 请取走你的钞票
// 你的余额为800
// 正在出钞,请稍等
// 请取走你的钞票
// 你的余额为600
}
线程的 synchronized 锁的使用(模拟银行取钱的多线程模式)
于 2023-11-03 18:35:46 首次发布