Thread同步问题,小案例

 要求

  1. 有两个用户分别从同一个卡上取钱(总额:10000元)
  2. 每次都取1000,当余额不足时,就不能取款了
  3. 不能出现超取现象====> 线程同步问题 
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 对象锁是一个非公平锁

Thread同步问题,小案例_第1张图片

你可能感兴趣的:(韩顺平java习题,java,开发语言)