多线程案例:购买车票

2023-12-19

/**

*

购票案例

多线程同步

多线程的并发执行虽然可以提高程序的效率,但是,当多个线程去访问同一个资源时,也会引发一些安全问题。

并发:同一个对象被多个线程同时操作。

处理多线程问题时,多个线程访问同一个对象﹐并且某些线程还想修改这个对象﹒这时候我们就需要线程同步.

线程同步其实就是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面线程使用完毕,下一个线程再使用

由于同一进程的多个线程共享同一块存储空间﹐在带来方便的同时,也带来了访问冲突问题﹐为了保证数据在方法中被访问时的正确性,

在访问时加入锁机制synchronized,当一个线程获得对象的排它锁,独占资源﹐其他线程必须等待,使用后释放锁即可.

存在以下问题:

一个线程持有锁会导致其他所有需要此锁的线程挂起;

在多线程竞争下,加锁,释放锁会导致比较多的上下文切换和调度延时,引起性能问题;

如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能问题.

我们可以通过private关键字来保证数据对象只能被方法访问﹐所以我们只需要针对方法提出一套机制,

这套机制就是synchronized关键字,目前多线程同步有常用的两种方法,分别是同步代码块和同步方法。

同步代码块

当多个线程使用同一个资源时,可以将处理共享资源的代码放置在一个代码块中,使用synchronized关键字来修饰,被称作同步代码块

上述代码中,lock是一个锁对象称之为同步监视器,它是同步代码块的关键。当线程执行同步代码块时,首先会检查锁对象的标志位,

默认情况下标志位为1,此时线程会执行同步代码块,同时将锁对象的标志位置为0。

当一个新的线程执行到这段同步代码块时,由于锁对象的标志位为0,新线程会发生阻塞,等待当前线程执行完同步代码块后,锁对象的标志位被置为1,

新线程才能进人同步代码块执行其中的代码。循环往复,直到共享资源被处理完为止。

同步方法

在方法前面同样可以使用synchronized关键字来修饰,被修饰的方法为同步方法,它能实现和同步代码块同样的功能。具体语法格式如下:

synchronized方法控制对“对象”的访问,被synchronized修饰的方法在某一时刻只允许一个线程访问,访问该方法的其他线程都会发生阻塞,

直到当前线程访问完毕后,其他线程才有机会执行方法。

缺陷:若将一个大的方法申明为synchronized将会影响效率。

*/

public class MySite implements Runnable{

public static void main(String[] args) {

MySite site = new MySite();

Thread t1 = new Thread(site,"林枫");

Thread t2= new Thread(site,"叶凡");

Thread t3 = new Thread(site,"石昊");

t1.start();

t2.start();

t3.start();

}

//定义票的数量

int count = 10;

//定义购买了第几张票

int sum = 0;

@Override

public void run() {

while (true){

synchronized (this){

if (count==0)

break;

count--;

sum++;

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName()+"购买了第"+sum+"张票,剩余"+count+"张票");

}

}

}

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多线程案例:购买车票 的相关文章

随机推荐

  • 2015,TEVC,Adaptive MOPSO Based on Parallel Cell Coordinate System

    Abstract 在多目标粒子群优化 MOPSO 的设计中 管理收敛性和多样性是至关重要的 以搜索真实Pareto最优前沿的准确和良好分布的近似 粒子群优化算法由于其快速收敛性 在进化过程中会导致多样性的快速丢失 现有的MOPSOs在 le
  • OneNote笔记使用记录

    1 快捷键 2 快速设置行距 Ctrl 1 设置一倍行距 Ctrl 2 两倍行距 Ctrl 5 1 5 倍行距 3 切换样式标题 Ctrl Alt 1 标题 1 Ctrl Alt 2 标题 2 Ctrl Alt 3 标题 3 Ctrl Sh
  • vtk用户指南 第十一章 随时间变化的数据

    11 1时序支持简介 创建可视化工具包的目的是允许人们可视化 从而探索具有空间范围的数据中的特征 它允许人们回答一些问题 比如 在这些数据中 最大价值的区域在哪里 它们有什么形状和价值 以及 这些形状是如何分布的 VTK提供了大量的技术来显
  • 阿里云一二级域名配置

    一级域名配置 二级域名配置
  • 2023中国品牌节金谱奖荣誉发布 酷开科技获颁OTT行业科技创新奖

    11月17日 19日 以 复苏与腾飞 为主题的2023第十七届中国品牌节 在杭州市云栖小镇国际会展中心成功举行 在18日晚间的荣耀盛典上 TopBrand 2023中国品牌节金谱奖 荣誉发布 酷开科技斩获OTT行业科技创新奖 酷开科技作为O
  • 面试150-13(Leetcode238除自身以外数组的乘积)

    代码 class Solution public int productExceptSelf int nums int n nums length int res new int n int product 1 int zerocnt 0
  • 再看参数校验

    作者简介 大家好 我是smart哥 前中兴通讯 美团架构师 现某互联网公司CTO 联系qq 184480602 加我进群 大家一起学习 一起进步 一起对抗互联网寒冬 写一个接口 大致就几个步骤 参数校验 编写Service Dao SQL
  • 如何开发一个免费的App

    开发一个免费App意味着能够在项目启动初期 以更低成本的方式进行业务的迭代和市场化验证 互联网发展到2023年 尤其在生成式AI及大模型技术 跃进式 增长的背景下 一个创新式商业模式的起步变得异常艰难 但如果用好工具 那么不仅能事半功倍 还
  • 网络安全设备概念的熟悉和学习

    什么是网络安全 网络安全技术有哪些 Web应用防火墙 WAF 为什么需要WAF 什么是WAF 与传统防火墙的区别 WAF不是全能的 入侵检测系统 IDS 什么是IDS 跟防火墙的比较 部署位置选择
  • 【网络安全】—Shell编程入门(1)

    文章目录 基础 变量概念介绍 特殊变量进阶 数值计算实践 条件测试比较 条件判断语句 流程控制语句 循环语句应用
  • threejs 解析外部模型关键帧动画

    参考资料 threejs中文网 threejs qq交流群 814702116 解析外部模型关键帧动画 前面几节课 用到的关键帧动画 是借助threejs提供的两个类 KeyframeTrack AnimationClip 自己写代码实现
  • SQL Server 大数据量分页

    1 ROW NUMBER OVER 方式 SQL2012以下推荐使用 SELECT FROM SELECT ROW NUMBER OVER ORDER BY menuId AS RowId FROM sys menu AS r WHERE
  • “jar“:CreateProcess error = 2,系统找不到指定的文件

    起因 系统配置的java环境为jar 或java环境不完整导致 修复 将jar exe拷贝至java环境的bin目录中即可
  • c语言:指针作为参数传递

    探究实参与形参它们相互独立 由于主调函数的变量 a b 与被调函数的形参 x y 它们相互独立 函数 swap 可以修改变量 x y 但是却无法影响到主调函数中的 a b 现在利用取地址运算符 分别打印它们的首地址 让我们从内存的角度 来分
  • 使用小程序实现App灰度测试的好处

    灰度测试 Gray Testing 是一种软件测试策略 也被称为渐进性测试或部分上线测试 在灰度测试中 新的软件版本或功能并非一次性推送给所有用户 而是仅在一小部分用户中进行测试 这可以帮助开发团队逐步暴露新功能或版本 以便及时发现和修复问
  • 网络安全基础知识

    1 什么是防火墙 什么是堡垒主机 什么是DMZ 防火墙是在两个网络之间强制实施访问控制策略的一个系统或一组系统 堡垒主机是一种配置了安全防范措施的网络上的计算机 堡垒主机为网络之间的通信提供了一个阻塞点 也可以说 如果没有堡垒主机 网络间将
  • Matlab-绘图及其位置摆放

    一 绘图函数 1 绘制二维图形 1 1 plot 函数的应用格式 1 plot x 当x 为一向量时 以x 元素的值为纵坐标 x 的序号为横坐标值绘制曲线 当x 为一实矩阵时 则以其序号为横坐标 按列绘制每列元素值相对于其序号的曲线 例如
  • threejs 机械虚拟装配案例(播放)

    参考资料 threejs中文网 threejs qq交流群 814702116 机械虚拟装配案例 播放 如果你想做一个产品 机械 建筑的虚拟装配动画 可以美术先在建模软件中生成关键帧动画的数据 然后通过threejs加载模型 播放动画数据即
  • 使用AI大模型无损放大照片

    在线体验 点击 图像处理 即可使用 private static final String IMAGE QUALITY ENHANCE https aip baidubce com rest 2 0 image process v1 ima
  • 多线程案例:购买车票

    购票案例 多线程同步 多线程的并发执行虽然可以提高程序的效率 但是 当多个线程去访问同一个资源时 也会引发一些安全问题 并发 同一个对象被多个线程同时操作 处理多线程问题时 多个线程访问同一个对象 并且某些线程还想修改这个对象 这时候我们就