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

ADB 1.0.41 端口 5037 占用排查:3 步定位并释放进程(附 netstat 命令详解) 本文详细解析了ADB 1.0.41端口5037被占用的问题,提供了3步精确定位并释放进程的方法,包括使用netstat命令查看端口占用、定位占用进程及终止进程的完整流程。特别针对daemon启动失败和CreateFileW错误给出了解决方案,帮助开发者快速恢复ADB调试功能。 阅读详情

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

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

这里我们就采用ConcurrentLinkedQueue方式避免加锁来实现。

package com.sync.ticket;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.TimeUnit;

/**
 * 12306有N张代售车票或者库存有N件商品
 * ConcurrentLinkedQueue 更高效的做法
 * 
 * @author 小辉GE/小辉哥
 * 
 * 2019年8月11日 下午19:40:00
 */
public class TicketSellerQueue {
	
	static Queue<String> tickets = new ConcurrentLinkedQueue<>();

	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 (true) {
					try {
						TimeUnit.MILLISECONDS.sleep(1);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					// 取出元素
					String ticket = tickets.poll(); 
					if (ticket == null) 
						break;
					else
						System.out.println(ticket + "已卖出");
				}
			}).start();
		}
	}
}

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

结果分析:

我们可以看出ConcurrentLinkedQueue避免加锁的方式也能实现。这时候可能有同学会问为什么呢?很简单,因为我们在程序里面只调用了队列的poll()方法,并且很巧妙的运用了poll()方法完成了我们想要的两种处理(1、取出元素、2、根据取出元素判断break),且没有调用其他的方法,所以说是原子性操作,因此也可以保证线程安全。关于ConcurrentLinkedQueue实现方式还不明白的同学,详情可以在我的头条号‘小辉GE’查看对应‘JAVA多线程高并发下如何保证车票(商品)出售业务线程安全’视频,里面有详细讲解。

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

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

 

多线程设计一个火车售票模拟程序 java通过并发进程实现火车自动售票程序,假如火车站有100张火车票要卖出去,现在有5个售票点同时售票,用5个线程模拟这5个售票点的售票情况。 立即下载

相关推荐

R语言TCGA数据下载避坑指南:biolinks包实战中的5个常见错误与解决方案

本文详细介绍了使用R语言的TCGAbiolinks包下载TCGA数据时常见的5个错误及其解决方案,包括安装与加载问题、查询构建参数设置、下载中断处理、数据加载格式不匹配以及版本兼容性问题。通过实战案例和代码示例,帮助生物信息学研究者高效获取TCGA数据,避免常见陷阱。

weixin_30892037的博客 84

Java多线程总结之聊一聊Queue

上个星期总结了一下synchronized相关的知识,这次将Queue相关的知识总结一下,和朋友们分享。 在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需

专注、专心、专业 2300

哈工大2021年秋季学期数据结构期末试题

因为考完试没有收演草纸,所以题中数据与考试差距不大。选项顺序可能略有差异;选择第5题希尔排序的序列数据是后编的;简答第3题B-树的插入序列顺序可能不同,但是考察的点是一样的。其他题的数据基本可以保证和原题一样。 一、选择题 111.以下代码的时间复杂度是 for(int k=1;k<=n;k++) for(int j=1;j<=n;j++) count++; A.O(n)       B.O(nlogn) &

Castria的博客 4271

ConcurrentLinkedQueue 线程安全链表队列

ConcurrentLinkedQueue 是线程安全的非阻塞队列,内部是单向链表。ConcurrentLinkedQueue 使用CAS机制保证线程安全,而LinkedBlockingQueue使用两个lock保证线程安全,ConcurrentLinkedQueue 性能比LinkedBlockingQueue高很多。需要注意的是ConcurrentLinkedQueue 的头节点和尾节点都具有滞后性,直接读取不应当准确,不能直接使用,一般需要遍历。

袁江南的博客 1641

一个测试工程师走进一家酒吧……

一个测试工程师走进一家酒吧,要了一杯啤酒;一个测试工程师走进一家酒吧,要了一杯咖啡;一个测试工程师走进一家酒吧,要了 0.7 杯啤酒;一个测试工程师走进一家酒吧,要了-1 杯啤酒;一个测试...

字节跳动技术团队官方博客 4884

Python Opencv cv2提取图像中某种特定颜色区域(例如黑字白纸背景下的红色公章提取),并将纯色背景透明化

拜拜PHOTOSHOP- 领导突然让我帮他把公章从图片中抠出来,在确保了不是要做坏事的情况下,我打开了PHOTOSHOP,用魔棒工具一点一点抠,但由于魔棒工具的原理是对比临近区域像素差值,导致封闭字体中的区域无法剔除,而且一点一点抠非常麻烦,愤而PYTHON,使用CV2完美解决。 效果如下(马赛克是我添加的): 任务就是把蓝色的公章抠出来。 效果如上。 代码如下: import cv2 import numpy as np src = cv2.imread(r"imagepath")#这里填你的原图像路

qq_43670549的博客 1万+

java多线程 --ConcurrentLinkedQueue 非阻塞 线程安全队列

ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部;当我们获取一个元素时,它会返回队列头部的元素。它采用了“wait-free”算法(即CAS算法)来实现。 阻塞队列BlockingQueue: 支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列...

A08110123的博客 276

解决ublox无法定位问题(一直输出$GxTXT)

最近开始研究有关RTK技术的项目,于是先购买了两块ublox公司的NEO-M8T-0型号芯片。(注意NEO-M8T还细分为NEO-M8T-0和NEO-M8T-2,前者不支持RTCM输出,后者支持RTCM输出) 首先都是按常规步骤,直接把芯片模块串口接电脑调试,这边推荐是用官网的u-center调试软件。GPS芯片大多数都是上电后串口自动发送定位等信息,这两块芯片有一块正常情...

众缈之门的博客 7358

多线程基础总结 之 -- ConcurrentLinkedQueue

ConcurrentLinkedQueue充分使用了atomic包的实现打造了一个无锁得并发线程安全的队列。对比锁机制的实现,个人认为使用无锁机 制的难点在于要充分考虑线程间的协调。简单的说就是多个线程对内部数据结构进行访问时,如果其中一个线程执行的中途因为一些原因出现故障,其他的线程能够 检测并帮助完成剩下的操作。这就需要把对数据结构的操作过程精细的划分成多个状态或阶段,考虑每个阶段或状态多线程...

phantomes的专栏 221

ios生成海报使用dom-to-image中toPng报错isTrusted:true

主要是ios中safari浏览器解析错误,引起的报错,主要引起原因toPng会调用toSvg,toSvg直接将html标签内容通过svg中foreignObject标签直接包裹,然后转base64, 通过data:image/svg+xml;解决办法:二次生成(调用两次),判断ios or 安卓,生成第一次生成,不用参数,例如:scale: 3,在第二次生成再进行清晰度操作,避免多次生成,引起性能消耗。以上种种很多案例,使用canvase进行转换的,标签丢失,直接toPng版本的,兼容性问题。

weixin_44601570的博客 2105

国产系统迁移实战:在银河麒麟V10上搞定Wine32位支持,让老Windows软件跑起来

本文详细介绍了在银河麒麟V10操作系统上构建Wine32位支持的全过程,帮助用户解决Windows应用迁移难题。从系统架构差异分析到Wine环境配置,再到实战应用部署与优化,提供了一套完整的解决方案,确保老Windows软件在国产系统上稳定运行。

weixin_32288959的博客 648

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

在并发编程场景下如何保证车票或者商品出售业务是线程安全的? 首先我们就会想到加锁,来保证出售业务线程安全。但是加锁势必会带来性能上的瓶颈。那么我们就会思考,还有没有其它的方式避免加锁来实现同样的效果呢? 这里我们带着这个问题,先采用常见的加锁方式来实现。 package com.sync.ticket; import java.util.ArrayList; import java.ut...

饶艳辉 280

国科大作业考试资料《人工智能原理与算法》2024新编-第二次作业整理

1、对于下列活动,分别给出任务环境的PEAS描述, 并按2.3.2节列出的性质进行分析: 3、为图2.2中描述的吸尘器世界实现一个可以进行性能度量的环境模拟器。你的实现是必须是模块化的,以使传感器、执行器和环境特征(大小、形状、灰尘放置等)便于修改。 4、实现上述题目真空吸尘器环境中的简单反射Agent。用所有可能的初始灰尘分布和Agent位置,运行环境模拟器和Agent。记录Agent在每种情况下的性能评分和总体平均评分。

MatsumotoChrikk 1187

Java ConcurrentLinkedQueue队列线程安全操作

Java ConcurrentLinkedQueue队列线程安全操作代码示例:package async; import java.util.ArrayList; import java.util.List; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; /** * * 线程安全队

Zhang Phil 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

由ConcurrentLinkedQueue扯到线程安全 待整理

前几天项目总是报错,找了下原因。 ConcurrentLinkedQueue 本身是一个基于链接节点的无界线程安全队列,你自己调用就不用考虑线程安全了吗? 结论是:原子性操作当然是线程安全的,非原子性那就不安全了 原子性操作: queue.add(obj); or queue.poll(); 非原子性操作(这里涉及到两个操作,在大并发的时候,在两个方法之间,在中间...

微尘的世界 245

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

入坑JAVA多线程并发(四)卖火车票了解一下

多线程最常用的两个例子就是:火车票和生产者消费者问题了,本文简单的实现一下卖火车票的例子, 首先创建车票类: class Ticket implements Runnable{ private int num; private int init = 1; private String lock; public Ticket(int num,String ...

鱼机的编程之路 6026

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

并发容器之ConcurrentLinkedQueue

1.ConcurrentLinkedQueue简介 在单线程编程中我们会经常用到一些集合类,比如ArrayList,HashMap等,但是这些类都不是线程安全的类。在面试中也经常会有一些考点,比如ArrayList不是线程安全的,Vector是线程安全。而保障Vector线程安全的方式,是非常粗暴的在方法上用synchronized独占锁,将多线程执行变成串行化。要想将ArrayList变成线程...

weixin_34356555的博客 517

Java的高并发编程系列 (八)火车票面试题解析

有N张火车票,每张票都有一个编号,同时有10个窗口对外售票,请写一个模拟程序。 使用Vector或者Collections.synchronizedXXX,分析一下,这样能解决问题吗? public class TicketSeller2 { private static Vector&lt;String&gt; tickets = new Vector&lt;String&gt...

N-SOKACH的博客 961

高并发编程之ConcurrentLinkedQueue讲解

一、ConcurrentLinkedQueue介绍 一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部 是队列中时间最长的元素,队列的尾部 是队列中时间最短的元素。当我们获取一个元素时,它会返回队列头部的元素。它采用了“wait-free”算法来实现,该算法在Michael &amp; Scott算法上进行了一些修改, Michael &amp; S...

weixin_42146366的博客 1085

关于ConcurrentLinkedQueue是否线程安全的疑问

大家先看我的测试程序:        public class Test{ public static void main( String[] args ){  final Pool pp =  new Pool();   new Thread(){    //启动线程1    public void run(){     System.out.println(" before allotTa

whlxjq520的地盘 1936

Java使用多线程和GUI实现购买火车票<集合>

文章目录绪:样例DEMO——购票项目项目要求实现步骤一、【车次.txt】【Person类】【Ticket类】1.【车次.txt】2.【Person类】3.【Ticket类】二、主窗口 【Window类】1、界面2、事件监听1.窗口加载就显示出信息2.查找按钮3. 刷新4.购买三、购买窗口【PayWindow类】1、界面2、实现线程接口【Runnable】3、事件监听1.提交信息2.下单3.窗口销毁源代码 绪: 多线程与并发 集合 GUI(ecplise插件WindowBuilder) 样例 DEMO

赵士杰——成功并非一蹴而就,而是在持之以恒的努力中逐渐实现。 2705

JAVA进阶篇——线程+实例演示(附商品销售实例源码)

何为线程? 简单来说,打开你电脑的任务管理器,在进程选项卡中,可以看到你电脑上一个一个正在运行的程序,我们可以把这里的每一个程序理解为一个进程,而进程是受系统管理的基本单元。 那么啥是线程呢?我们可以理解为一个进程里面包含了很多个线程。而一个线程可以当作这个进程的一个子任务。就比如说你的微信,在你刷朋友圈的同时,也可以接收消息,这就是两个线程在运行。 我们为什么要用线程呢?我们来看看下面这张图。 那么我们用了线程以后呢? 由图可知,任务二并不需要按照我们平常所写地Java代码从上到下执行,需要等待10S,

肝铁侠的博客 716

java 高并发 票_多线程高并发编程之火车售票的多种方法

面试题:有n张火车票,每张票都有一个编号,同时有10个窗口对外售票,请写一个模拟程序Case1( 使用ArrayList:问题引入)import java.util.ArrayList;import java.util.List;public class TicketSeller1 {static List tickets=new ArrayList<>();static {for (...

weixin_34140828的博客 572

卖火车票的java程序_java实现火车票售卖-高并发

实现1:* 售卖火车票实现1:* 用ArrayList** 产生的问题:* 重复销售* 超量销售** 原因:* 1.size不是原子的* 2.remove不是原子的* 3.判断+操作 不是原子的package sell_ticket_test;/*** 售卖火车票实现1:* 用ArrayList** 产生的问题:* 重复销售* 超量销售** 原因:* 1.size不是原子的* 2.r...

weixin_30356285的博客 513
上一篇: JAVA并发编程下保证车票出售线程安全之synchronized锁
下一篇: 面试锦集:手写一个同步类容器之BlockingQueue实现
饶艳辉
博客等级 码龄15年 20粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值