JAVA并发编程下保证车票出售线程安全之synchronized锁

华为OD机试_2025 B卷_模拟消息队列(Python,100分)(附详细解题思路) 时间排序:确保事件处理顺序正确消费者管理:集合操作高效维护状态优先级实现:利用消费者ID自然排序边界处理:正确处理空消费者情况。 阅读详情

在并发编程场景下如何保证车票或者商品出售业务是线程安全的?

首先我们就会想到加锁,来保证出售业务线程安全。但是加锁势必会带来性能上的瓶颈。那么我们就会思考,还有没有其它的方式避免加锁来实现同样的效果呢?

这里我们带着这个问题,先采用常见的加锁方式来实现。

package com.sync.ticket;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import java.util.concurrent.TimeUnit;

/**
 * 12306有N张代售车票或者库存有N件商品
 *
 * @author 小辉GE/小辉哥
 * <p>
 * 2019年8月11日 下午19:40:00
 */

public class TicketSellerSync {

    static List<String> tickets = new ArrayList<>();
    //static List<String> tickets = new Vector<>();

    static {
        for (int i = 0; i < 1000; i++) tickets.add("车票/商品编号:" + i);
    }

    public static void main(String[] args) {
		/*for (int i = 0; i < 10; i++) {
			new Thread(() -> {
				while (tickets.size() > 0) {
					try {
						TimeUnit.MILLISECONDS.sleep(1);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(tickets.remove(0) + "已卖出");
				}
			}).start();
		}*/

        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                while (true) {
                    synchronized (tickets) {
                        if (tickets.size() <= 0) break;
                        try {
                            TimeUnit.MILLISECONDS.sleep(1);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(tickets.remove(0) + "已卖出");
                    }
                }
            }).start();
        }
    }
}

测试输出结果如下(输出结果比较多,我们只截取部分):

结果分析:

我们可以看出加锁是肯定能保证线程安全,保证车票或者商品出售业务不会重复,或者超出范围。那么,我们只能加锁来实现吗,有没有更高效的不用加锁的方式,其实是有的,我们可以用线程安全的同步队列来实现,但是一定要保证操作方法是原子性的。下一篇我们会用ConcurrentLinkedQueue的方式来实现。

以上代码仅供参考,如有不当之处,欢迎指出!!!

更多干货,欢迎大家关注和联系我。期待和大家一起更好的交流、探讨技术!!!

 

【Azure 架构师学习笔记】- Azure Private Endpoint 公有云的其中一个特点是默认允许公网访问, 这就对企业环境带来风险,也是很多年前企业对公有云抵触的其中一个原因,现在这类问题已经很少,因为有了很多技术来确保云上的资源被安全地访问。其中Private endpoint(PE)就起到了很重要的作用。云上的某个资源如VM会创建在特定的网络(VNet/Subnet)上, 而其他如Storage Account , Azure SQL等PaaS服务则没有。如果你需要用VM 来访问这些PaaS资源,VM 就会通过资源的公网IP 来访问。 阅读详情

相关推荐

Telegram 担保交易系统搭建指南:安全可靠的交易流程实现

本文介绍了基于Telegram Bot API搭建担保交易系统的完整方案。该系统通过第三方资金托管机制解决买卖双方信任问题,支持"付款后发货"和"收货后放款"的交易流程。文章详细阐述了系统架构设计,包括Telegram Bot交互层、后端业务逻辑层、数据库层和支付接口层。核心实现步骤涵盖:1)订单创建模块处理交易信息;2)支付处理模块集成Stripe Escrow实现资金托管;3)确认收货模块完成资金划转。系统采用PostgreSQL存储交易数据,并通过FastAPI

jingpide9527的博客 1945

基于Java实现的火车票抢票并发数据结构处理

如图一所示,蓝色矩形代表火车,其上橙色的方块代表火车上的每个座位(因为查询、 购买、退票的三个方法都没有关于车厢的参数,所以我们在数据抽象时可以不用考虑火车的 车厢数,而将整个火车视为一个车厢),橙色方块上的第 i 个青色方块代表该座位在站点 i(i

毕业作品网站 850

OpenCV图像去畸变实战指南:从原理到参数调优(附完整代码与效果对比)

本文深入解析了OpenCV图像去畸变的原理与实战技巧,详细对比了标准透视、鱼眼及全能型omnidir三种校正函数的核心参数调优方法。通过分析alpha、balance、centerX/Y及focalScale四大参数对输出效果的影响,并结合完整代码与效果对比图,帮助开发者精准校正镜头畸变,提升计算机视觉任务精度。

weixin_29046611的博客 341

31_1线程安全(买票案例):加锁方式(synchronized、Lock锁)【同步代码块、同步方法】

1.线程安全 — 买票案例synchronized代码块synchronized方法(成员同步方法、静态同步方法)Lock锁注意:1.加锁的方式2.锁对象(多个线程去操作同一把锁才能互斥住)

gangain的博客 1583

手把手教你用Simulink给C2000配置SCI串口发送数据(附模型与避坑点)

本文详细介绍了如何使用Simulink为C2000系列微控制器配置SCI串口发送数据,包括硬件资源分配、模型搭建、参数设置及调试技巧。通过代码生成和串口通信实践,帮助开发者高效实现嵌入式系统开发,避免常见通信问题。

weixin_30831529的博客 294

论文阅读——Bayesian Knowledge Fusion(贝叶斯知识融合)

该篇论文解决了不确定环境中的信息融合问题。想象一下,有多位专家针对同一情况构建概率模型,我们希望汇总他们提供的信息。直接合并每个信息可能会遇到几个问题。例如,专家们可能不同意某个事件发生的概率,或者他们可能不同意两个事件之间因果关系的方向(例如,一个人认为 A 导致 B,而另一个人认为 B 导致 A)。他们甚至可能不同意概率网络中一组变量之间的整个依赖结构。

qq_64164071的博客 1496

java 订单审核 加锁_Java生鲜电商平台-OMS订单系统中并发问题和锁机制的探讨与解决方案...

Java生鲜电商平台-OMS订单系统中并发问题和锁机制的探讨与解决方案说明:Java开源生鲜电商中OMS订单系统中并发问题和锁机制的探讨与解决方案:问题由来假设在一个订单系统中(以火车票订单系统为例),用户A,用户B都要预定从成都到北京的火车票,A、B在不同的售票窗口均同时查询到了某车厢卧铺中、下铺位有空位。用户A正在犹豫订中铺还是下铺,这时用户B果断订购了下铺。当用户A决定订下铺时,系统提示下铺...

weixin_35143514的博客 466

固定时间收敛的控制器设计(基础知识)

针对控制系统的有限时间收敛和固定时间收敛给出一些常用定理。

qq_40241332的博客 1万+

java同步锁-实现买火车票

转自:http://blog.youkuaiyun.com/lianqiangjava/article/details/12652201/比如火车卖票,火车票是一定的,但卖火车票的窗口到处都有,每个窗口就相当于一个线程,这么多的线程共用所有的火车票这个资源。如果在一个时间点上,两个线程同时使用这个资源,那他们取出的火车票是一样的(座位号一样),这样就会给乘客造成麻烦。比如下面程序: 程序的运行结果:

可可 3637

告别手动输入!用Access批量导入307种土壤数据到SWAT模型(附完整MDB操作流程)

本文详细介绍了如何利用Microsoft Access批量导入307种土壤数据到SWAT模型,显著提升数据录入效率。通过解析usersoil表结构、提供Access操作指南和VBA自动化脚本,帮助环境工程师避免手动输入错误,实现高效数据管理。文章还包含性能优化技巧和常见错误解决方案,是SWAT模型用户的实用指南。

weixin_28366053的博客 324

CodeQL查询时遇到报错:A fatal error occurred: Could not process query metadata for...如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1083

【Java篇】Java多线程完成火车票售卖案例

我们在学习Java多线程时,可能最典型的一个案例就是火车票售卖,那么如何在不重复售票的情况下卖出全部火车票,我们通过Java多线程来完成,并根据 synchronized 同步锁关键字来限制同时卖出一张票的情况!

破烂码农 4480

光学传播仿真软件:ASAP_(1).ASAP软件介绍与安装

ASAP(Advanced System for Analysis and Propagation)是一款强大的光学传播仿真软件,广泛应用于光学系统的设计、分析和优化。它提供了丰富的建模工具和仿真功能,可以帮助用户从简单的光学元件到复杂的光学系统进行仿真。:支持光学、机械、热学等多物理场的联合仿真。:采用高精度的算法,确保仿真结果的准确性。:内置了大量的光学元件,如透镜、反射镜、棱镜、光栅等。:提供直观的用户界面,支持多种建模和仿真方式。:支持使用脚本语言进行二次开发,增强软件的定制能力。

kkchenjj的博客 1590

java 锁实现,Java Synchronized锁和Lock锁实现简单的卖火车票案例

Java Synchronized锁和Lock锁实现简单的卖火车票案例发布时间:2018-08-17作者:laosun阅读(2685)Java的线程机制是抢占式的,这表示调度机制会周期性的中断线程,将上下文切换到另一个线程。Java线程的优先级设置setPriority():线程是通过映射到原生线程上来实现的,所以线程的调度最终还是取决于操作系统,操作系统的优先级于Java的优先级并不一一对应,如...

weixin_27960253的博客 481

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

并发编程 - Synchronized

1.为什么要使用synchronized 在并发编程中存在线程安全问题,主要原因有:1.存在共享数据 2.多线程共同操作共享数据。关键字synchronized可以保证在同一时刻,只有一个线程可以执行某个方法或某个代码块,同时synchronized可以保证一个线程的变化可见(可见性),即可以代替volatile。 案例 package com.yxl.demo.ThreadTest; publ...

浪人与酒 1726

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【并发编程】java多线程之线程安全

什么是线程安全?为什么有线程安全问题? 当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。 案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。 代码: public class ThreadTrain implements Runnable { private i...

jiaodaguan的博客 267

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java并发编程-2.线程安全

Java并发编程-线程安全

silly8543 193

并发编程-多线程线程安全

并发编程之多线程线程安全 什么是线程安全? 为什么有线程安全问题? 当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。 案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。 代码: public class ThreadTrain implements Runnable { pr...

zjk_forever的博客 396

并发编程之多线程线程安全

著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。 什么是线程安全? 为什么有线程安全问题? 当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。 案例: 需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。 public class ThreadTrain implements Runnable { private int trainCount = 10;

程序员蒋老湿的博客 286

JAVA并发编程之多线程线程安全

什么是线程安全? 为什么有线程安全问题? 当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。 案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。 代码: public class ThreadTrain implements Runnable { private int tr...

kai46385076的专栏 249

【2】多线程线程安全

目录 知识点1:什么是线程安全? 1、为什么有线程安全问题? 知识点2:线程安全解决办法 1、内置的锁 2、同步代码块synchronized 3、同步方法 (1)什么是同步方法? (2)同步方法使用的是什么锁? (3)静态同步函数 知识点3:多线程死锁 1、什么是多线程死锁? 知识点4:Threadlocal 1、什么是Threadlocal 2、ThreadL...

19年的努力,并不是说说而已! 12万+

并发编程02--线程安全

线程安全 线程安全问题 当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。 案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。代码: public class ThreadTrain implements Runnable { private int trainCo...

tyf2007635的博客 160

并发编程之多线程线程安全(二)

1.什么是线程安全? 1.1为什么有线程安全问题?         当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。 案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。 public class ...

qq_39380737的博客 478

同步代码块解决线程安全

案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。 代码: package com.learn; class ThreadDemo01 implements Runnable { // 同时多个窗口共享100 private static int count = 100;// 存放方法区中 private static Object obj = new...

Leon_Jinhai_Sun的博客 225
上一篇: JAVA并发编程Fork/Join(分而治之思想)之(ForkJoinPool/ForkJoinTask)
下一篇: JAVA并发编程下保证车票出售线程安全之ConcurrentLinkedQueue
饶艳辉
博客等级 码龄15年 20粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值