Ticket.java 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. package com.sf.javase.thread.sync;
  2. import lombok.SneakyThrows;
  3. // 解决买票的超卖问题
  4. public class Ticket {
  5. public static void main(String[] args) {
  6. Window window = new Window();
  7. // 三个线程使用同一个window对象
  8. // 一个window对象 只有一个lock对象 所以使用的是同一把锁
  9. new Thread(window, "t1").start();
  10. new Thread(window, "t2").start();
  11. new Thread(window, "t3").start();
  12. }
  13. private static class Window implements Runnable {
  14. private int ticketsNum = 100;
  15. // 创建一个对象 用对象来加锁
  16. Object lock = new Object();
  17. // lombok提供了一个处理异常的注解
  18. @SneakyThrows
  19. @Override
  20. public void run() {
  21. while (true) {
  22. // 同步代码块
  23. synchronized (lock) {
  24. if (ticketsNum > 0) {
  25. Thread.sleep(100);
  26. System.out.println(Thread.currentThread().getName() + " : " + ticketsNum--);
  27. }
  28. }
  29. }
  30. }
  31. }
  32. }