Java多线程练习题(三):轮流取数

(1)有两个用户分别从同一个卡取钱(总额:10000) (2)每次都取1000,当余额不足时,就不能取款了 (3)不能出现超取现象=》线程同步问题
public class demo9 {
          
   
    /*(1)有两个用户分别从同一个卡取钱(总额:10000)
    (2)每次都取1000,当余额不足时,就不能取款了
    (3)不能出现超取现象=》线程同步问题*/

    public static void main(String[] args) {
          
   
        Ticker ticker = new Ticker();
        Thread thread1 = new Thread(ticker,"t1");
        Thread thread2 = new Thread(ticker,"t2");

        thread1.start();
        thread2.start();
    }
}

class Ticker implements Runnable {
          
   
    private Integer picker = 10000;
    private boolean loop = true;

    @Override
    public void run() {
          
   
        while (loop) {
          
   
            //1.这里使用synchronized实现了线程同步
            //2.当多个线程执行到这里时,就会去争夺this对象锁
            //3.哪个线程争夺(获取)this对象锁,就执行synchronized代码块,执行完成就会释放this对象
            //4.争夺不到this对象锁,就blocked,准备继续争夺
            synchronized (this) {
          
   
                if (picker - 1000 < 0) {
          
   
                    loop = false;
                    break;
                }
                picker -= 1000;
                System.out.println(Thread.currentThread().getName() + "消费了1000,剩余" + picker);
            }
            try {
          
   
                Thread.sleep(1000);
            } catch (InterruptedException e) {
          
   
                e.printStackTrace();
            }
        }
    }
}
经验分享 程序员 微信小程序 职场和发展