• java多线程实现同步锁卖票窗口案例


    同步概念与方法:

     窗口类:

    1. public class Ticket implements Runnable{
    2. int tickets=20;//总共20张票
    3. @Override
    4. public void run() {
    5. while (tickets>0) {
    6. synchronized (this) {
    7. if(tickets>0) {
    8. //售票
    9. try {
    10. System.out.println(Thread.currentThread().getName()+"正在售票");
    11. Thread.sleep(200);//模拟售票操作时间
    12. tickets--;//完成售票
    13. System.out.println(Thread.currentThread().getName()+"售票完成,"+"剩余"+tickets+"张票");
    14. } catch (InterruptedException e) {
    15. e.printStackTrace();
    16. }
    17. }
    18. }
    19. }
    20. }
    21. }

    测试类:

    1. public class Test {
    2. public static void main(String[] args) {
    3. Ticket ticket = new Ticket();
    4. //模拟三个窗口售票
    5. Thread t1=new Thread(ticket);
    6. t1.setName("窗口1");
    7. t1.start();
    8. Thread t2=new Thread(ticket);
    9. t2.setName("窗口2");
    10. t2.start();
    11. Thread t3=new Thread(ticket);
    12. t3.setName("窗口3");
    13. t3.start();
    14. }
    15. }

    测试结果:

    窗口1正在售票
    窗口1售票完成,剩余19张票
    窗口1正在售票
    窗口1售票完成,剩余18张票
    窗口1正在售票
    窗口1售票完成,剩余17张票
    窗口3正在售票
    窗口3售票完成,剩余16张票
    窗口2正在售票
    窗口2售票完成,剩余15张票
    窗口2正在售票
    窗口2售票完成,剩余14张票
    窗口2正在售票
    窗口2售票完成,剩余13张票
    窗口2正在售票
    窗口2售票完成,剩余12张票
    窗口2正在售票
    窗口2售票完成,剩余11张票
    窗口2正在售票
    窗口2售票完成,剩余10张票
    窗口2正在售票
    窗口2售票完成,剩余9张票
    窗口2正在售票
    窗口2售票完成,剩余8张票
    窗口2正在售票
    窗口2售票完成,剩余7张票
    窗口2正在售票
    窗口2售票完成,剩余6张票
    窗口2正在售票
    窗口2售票完成,剩余5张票
    窗口2正在售票
    窗口2售票完成,剩余4张票
    窗口2正在售票
    窗口2售票完成,剩余3张票
    窗口2正在售票
    窗口2售票完成,剩余2张票
    窗口2正在售票
    窗口2售票完成,剩余1张票
    窗口2正在售票
    窗口2售票完成,剩余0张票

    Process finished with exit code 0

    不加同步锁测试结果:

    窗口3正在售票
    窗口1正在售票
    窗口2正在售票
    窗口1售票完成,剩余18张票
    窗口1正在售票
    窗口2售票完成,剩余19张票
    窗口3售票完成,剩余19张票
    窗口2正在售票
    窗口3正在售票
    窗口2售票完成,剩余16张票
    窗口2正在售票
    窗口1售票完成,剩余15张票
    窗口3售票完成,剩余16张票
    窗口1正在售票
    窗口3正在售票
    窗口3售票完成,剩余13张票
    窗口1售票完成,剩余14张票
    窗口1正在售票
    窗口2售票完成,剩余12张票
    窗口2正在售票
    窗口3正在售票
    窗口2售票完成,剩余10张票
    窗口1售票完成,剩余11张票
    窗口1正在售票
    窗口3售票完成,剩余11张票
    窗口2正在售票
    窗口3正在售票
    窗口2售票完成,剩余8张票
    窗口1售票完成,剩余8张票
    窗口3售票完成,剩余8张票
    窗口1正在售票
    窗口2正在售票
    窗口3正在售票
    窗口2售票完成,剩余5张票
    窗口1售票完成,剩余5张票
    窗口3售票完成,剩余7张票
    窗口1正在售票
    窗口2正在售票
    窗口3正在售票
    窗口2售票完成,剩余2张票
    窗口1售票完成,剩余3张票
    窗口3售票完成,剩余2张票
    窗口1正在售票
    窗口2正在售票
    窗口3正在售票
    窗口3售票完成,剩余1张票
    窗口2售票完成,剩余0张票
    窗口1售票完成,剩余1张票

    Process finished with exit code 0

    synchronized与Lock锁的区别:

    Java synchronized与Lock_扶朕去网吧的博客-CSDN博客_java锁synchronized与lock

  • 相关阅读:
    一笑的大型连续剧之第一集
    call()、apply()、bind() 区别、使用场景、实现方式
    如何有效进行回顾会议(中)?
    10多家公司的Java开发面试常见问题合集
    谷粒学院16万字笔记+1600张配图(十三)——搭建前台环境、首页数据显示
    Unity引擎制作玻璃的反射和折射效果
    C# Onnx Yolov8 Pose 姿态识别
    从网页的canvas上保存渲染的图片
    spring-cloud-starter-alibaba-nacos-config 启动配置管理
    刷题笔记之十二(快到碗里来+跳台阶+变态跳台阶+不用加减乘除做加法+三角形+猴子分桃+反转部分单向链表)
  • 原文地址:https://blog.csdn.net/qq_52135683/article/details/126820293