要求
- 有两个用户分别从同一个卡上取钱(总额:10000元)
- 每次都取1000,当余额不足时,就不能取款了
- 不能出现超取现象====> 线程同步问题
public static void main(String[] args) {
BankChoic bankChoic = new BankChoic();
Thread thread1 = new Thread(bankChoic);
thread1.setName("取款1号");
Thread thread2 = new Thread(bankChoic);
thread2.setName("取款2号");
//线程启动
thread1.start();
thread2.start();
}
}
class BankChoic implements Runnable {
private static int money = 10000;
/**
* 1.这里使用 synchronized 实现了线程同步
* 2.当多个线程执行到这里时,就会争夺 this 对象锁
* 2.哪个线程争夺到(获取) this 对象锁,就执行synthronized 代码块 ,执行完毕后,就会释放 this 对象锁
* 4.争夺不到 this 的对象锁,就会 blocked ,准备继续争夺
*/
@Override
public /*synchronized*/ void run() {
while (true) {
synchronized (this) {
if (money < 0) {
System.out.println("余额不足!");
break;
}
money -= 1000;
System.out.println("取款线程:" + Thread.currentThread().getName() + "\t剩余金额:" + money + "元");
}
//休眠1s
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (money == 0) {
break;
}
}
System.out.println("线程已经结束~");
}
}
1.这里使用 synchronized 实现了线程同步
2.当多个线程执行到这里时,就会争夺 this 对象锁
3.哪个线程争夺到(获取) this 对象锁,就执行synthronized 代码块 ,执行完毕后,就会释放 this 对象锁
4.争夺不到 this 的对象锁,就会 blocked ,准备继续争夺
5.this 对象锁是一个非公平锁