当前位置: 首页 > news >正文

JavaAdv——多线程同步案例(售票系统)

售票系统

假设您正在开发一个基于Java多线程技术的售票系统。该系统需要支持多个售票窗口同时进行售票操作,并且要确保不会出现超卖或漏卖的情况。具体来说,系统应该具备如下特点:

  1. 票的数量有限:初始时系统中有100张票。

  2. 多线程售票:系统支持多个售票窗口同时进行售票操作。

  3. 线程安全:必须确保即使在高并发情况下也不会出现超卖或漏卖的问题。

Runnable

==查看结果,分析代码==

public void run() {
    while (true) {
        if (count > 0) {
            System.out.println(Thread.currentThread().getName() + "正在卖第" + count + "张票");
            count--;
            try {
                Thread.sleep(100);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            break;
        }
    }
}

==加上同步锁==

public void run() {
    while (true) {
        synchronized (this) {
            if (count > 0) {
                System.out.println(Thread.currentThread().getName() + "正在卖第" + count + "张票");
                count--;
                try {
                    Thread.sleep(100);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                break;
            }
        }
    }
}

==注意同步锁的位置==

public void run() {
    while (count > 0) {
        synchronized (this) {
            System.out.println(Thread.currentThread().getName() + "正在卖第" + count + "张票");
            count--;
            try {
                Thread.sleep(100);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

Thread

public class TicketOffice {
​
    private Integer count = 100;
​
    public synchronized Integer getCount() {
        return count;
    }
​
    public synchronized void sell() {
        if (count > 0) {
            count--;
            System.out.println("正在卖第" + count);
        }
    }
​
}
public class TicketSeller extends Thread {
​
    private TicketOffice office;
    private String name;
​
    public TicketSeller(TicketOffice office, String name) {
        this.office = office;
        this.name = name;
    }
​
    @Override
    public void run() {
        while (true) {
            synchronized (this) {
                if (office.getCount() > 0) {
                    try {
                        office.sell();
                        Thread.sleep(100); // 模拟售票延迟
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    break;
                }
            }
        }
    }
​
}

==在synchronized块内的操作,确实是在该块执行完毕前不会被其他线程打断的。==

==但是,如果在这个同步块内调用了某个非同步的方法,并且这个方法修改了共享资源,那么就有可能会出现线程安全问题。==

synchronized块的作用范围

在一个代码块上使用synchronized关键字时,该块内的所有操作都会被视为原子的,在该块内不会被其他线程打断。

然而,这种保证仅限于该同步块内。如果在同步块内调用了一个非同步的方法,那么该方法的操作就不受该同步块的保护,可能会被其他线程干扰。

相关文章:

  • OpenCV计算摄影学(16)调整图像光照效果函数illuminationChange()
  • BambuStudio学习笔记:KDTreeIndirect类
  • 数据库复习(第五版)- 第四章 数据库安全性
  • LeetCode hot 100—二叉树的中序遍历
  • 【JavaEE】SpringMVC简单练习
  • GTX 50系显卡cuda、pytorch环境配置
  • VMware ESX曝3个0Day漏洞,已被黑客利用
  • 股指期货的主要用途有哪些?
  • 百度权重有什么用?如何查看百度权重?
  • 20250306JIRA添加企业微信邮箱通知
  • C++ primier plus 第七节 函数探幽第一部分
  • Stable Diffusion教程|快速入门SD绘画原理与安装
  • 文本处理Bert面试内容整理-如何使用BERT进行微调?
  • linux0.11内核源码修仙传第四章——head.s
  • 长轮询和短轮询的区别?
  • WebAssembly技术及应用了解
  • 【硬件IIC与软件IIC在程序实现上的核心区别】结合STM32F103C8T6标准库代码进行对比分析
  • 高效玩转 PDF:实用的分割、合并操作详解
  • Windows下sql server2012安装流程
  • 十七、从0开始卷出一个新项目之瑞萨RZN2L定时器(GPT)+DMA生成PWM的运动控制
  • 医院导航网站怎么做/百度互联网营销顾问
  • 做3dmax展示的网站/aso优化教程
  • 裂变营销模式/海外seo是什么
  • 凡科互动怎么发布/seo优化检测
  • 用r语言 做网站点击热力图/网络seo优化公司
  • 郴州住房和城乡建设委员会网站/微信公众号的推广