线程安全同步问题

2023-11-04

/*
 需求: 模拟3个窗口同时在售50张 票 。
 
问题1 :为什么50张票被卖出了150次?

出现 的原因: 因为num是非静态的,非静态的成员变量数据是在每个对象中都会维护一份数据的,三个线程对象就会有三份。

解决方案:把num票数共享出来给三个线程对象使用。使用static修饰。

问题2: 出现了线程安全问题 ?

线程 安全问题的解决方案:sun提供了线程同步机制让我们解决这类问题的。
	
	java线程同步机制的方式:
	
		方式一:同步代码块
			
			同步代码块的格式:
				
				synchronized(锁对象){
					需要被同步的代码...
				}

同步代码块要注意事项:
		1. 任意的一个对象都可以做为锁对象。
		2. 在同步代码块中调用了sleep方法并不是释放锁对象的。
		3. 只有真正存在线程安全问题的时候才使用同步代码块,否则会降低效率的。
		4. 多线程操作的锁 对象必须 是唯一共享 的。否则无效。
		

需求: 一个银行账户5000块,两夫妻一个拿着 存折,一个拿着卡,开始取钱比赛,每次只能取一千块,要求不准出现线程安全问题。
		
		
		
		方式二:同步函数

出现线程安全问题的根本原因:
	1. 存在两个或者两个以上 的线程对象,而且线程之间共享着一个资源。
	2. 有多个语句操作了共享资源。
	

 
 */


class Ticket extends Thread {

	static int tickets = 100;// 静态票数

	static Object object = new Object(); // 静态锁(只要是对象都可以充当锁)!!!静态锁!!!!

	public Ticket(String name) {
		super(name);
	}

	@Override
	public void run() {

		while (true) {
			// 同步代码块
			synchronized (object) {
				if (tickets > 0) {
					System.out.println(Thread.currentThread().getName()
							+ "卖出了第 " + tickets + "张票");
					tickets--;
				} else {
					System.out.println(Thread.currentThread().getName() + "售罄");
					break;
				}
			}

		}

	}

}

public class Demo2 {
	public static void main(String[] args) {
		// 创建三个线程对象,模拟三个窗口
		Ticket ticket1 = new Ticket("窗口一");
		Ticket ticket2 = new Ticket("窗口二");
		Ticket ticket3 = new Ticket("窗口三");
		// 开启线程售票
		ticket1.start();
		ticket2.start();
		ticket3.start();
	}
}

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

线程安全同步问题 的相关文章

  • JSON.stringify && JSON.parse

    原生JS 通过 ajax请求数据的时候控制台报500的错误 在这里记录一下 不喜勿喷哈 let submit document getElementsByClassName submit 0 submit addEventListener
  • idea突然打不开【解决方法整理总结】

    今天突发情况打不开 下面分情况讨论 欢迎大家给出不同的错误版本 狗头 一直这样 每天一遍qwq 解决方案 可以先找到idea安装根目录bin下 选中idea bat右键编辑 或者使用txt打开在idea bat最后一行添加 pause 打印
  • 解决pythoncharm中安装numpy无法调用的问题

    1 提示ImportError numpy core multiarray failed to import 可能问题 numpy的版本不合适 解决方法 1 卸载安装的numpy安装新的版本 pip uninstall numpy pip
  • 稀疏奖励及模仿学习(DataWhale组队学习笔记)

    稀疏奖励 在用强化学习解决现实问题时 我们对学习目标设置相应的奖励 但在庞大的状态空间中 智能体想要通过随机试错来获取奖励的概率是极低的 不获得奖励就没办法学习 我们将这种情况称作稀疏奖励 针对稀疏奖励问题 我们介绍以下几种解决方案 1 R
  • React脚手架

    React脚手架 xxx脚手架 用来帮助程序员快速创建一个基于xxx库的模板项目 包含了所有需要的配置 语法检查 jsx编译 devServer 下载好了所有相关的依赖 可以直接运行一个简单效果 react提供了一个用于创建react项目的
  • 传奇服务器开启生肖系统,英雄合击十二生肖商业版[带补丁]

    英雄合击十二生肖商业版 带补丁 新增功能 最新梦幻十二生肖 新模型 新样式 新一年的开始 多种表情 更强的脚本功能 长久寿命 返回不败传奇时代 加入新地图 精灵城 机械城 机械城下 怪物等级显示 支持原有 卧龙 英雄 合击 新技能 护体盾
  • 哈夫曼树与哈夫曼编码及等长编码

    哈夫曼树的构造 就是将给定的数据中选择最小的两个权值进行合并 然后重复该操作 构造出一个二叉树 使其带权路径长度WPL最小的二叉树称为哈夫曼树或最优二叉树 例如 给定几个数值 0 07 0 19 0 02 0 06 0 32 0 03 0
  • webFlux运算符决策树-个人翻译

    目录 创建新的序列 转换现有的序列 窥探序列 Peek 过滤序列 filter 错误处理 时间相关处理 分割一个序列 同步的操作 Flux广播给多个订阅者 Reactor运算符决策树 创建新的序列 发布已经获取的T just Flux Mo
  • 彻底解决Qt报错:无法定位程序输入点于动态链接库

    一 问题描述 前段时间使用Qt Creator写程序 在最后打包的时候出错 期间尝试修改环境变量的顺序 后来发现不是环境变量的问题 但问题解决后并未将环境变量改回 导致今天使用VS2019联合Qt编译之前程序 之前已验证正确 的时候报错 具
  • alter table move跟shrink space的区别

    author skate time2010 05 28 alter table move跟shrink space的区别 今天主要从两点说他们的区别 1 碎片的整理 2 空间的收缩 SQL gt select from v version
  • 线性表的查找

    1 顺序查找 1 顺序查找介绍 顺序查找的查找过程为 从表的一端开始 依次将记录的关键字和给定的值进行比较 若某个记录的关键字和给定的值是一样的 则查找成功 反之 若扫描整个表之后 任然没有找到关键字和给定的值相等的记录 则查找失败 适用用
  • Java 读写锁 ReadWriteLock 原理与应用场景详解

    什么是读写锁 读写锁并不是JAVA所特有的读写锁 Readers Writer Lock 顾名思义是一把锁分为两部分 读锁和写锁 其中读锁允许多个线程同时获得 因为读操作本身是线程安全的 而写锁则是互斥锁 不允许多个线程同时获得写锁 并且写
  • 音视频 ffplay播放控制

    选项 说明 q ESC 退出播放 f 全屏切换 p SPC 暂停 m 静音切换 9 0 9减少音量 0增加音量 a 循环切换音频流 v 循环切换视频流 t 循环切换字幕流 c 循环切换节目 w 循环切换过滤器或显示模式 s 逐帧播放 lef
  • 第十九届“华为杯”研究生数学建模竞赛总结

    目录 一 前言 二 前提准备 2 1 寻找队友 2 2 赛前训练 2 3 赛前资料搜集 2 4 赛前分工 三 比赛时间规划 四 比赛过程 4 1 比赛选题 4 2 正赛开始 4 3 前期思路 4 4 难点 4 5 解决难点 4 6 规定时间
  • linux无桌面运行javafx图形界面程序

    第一步 安装mini版centos7 第二步 配置网卡IP和开机自启 可以用nmtui配置 伪图形界面 第三步 yum安装所有xorg服务和xterm服务 yum install xorg xterm y 第四步 解压jdk 8u291 l
  • Flask 学习记录

    python环境 1 安装 pyenv 用来切换各个python版本 pyenv的安装方式包括多种 重点推荐采用pyenv installer的方式 原因主要有两点 a 通过pyenv installer可一键安装pyenv全家桶 后续也可
  • [原创] 关于 “中国天气网 - www.weather.com.cn” 相关的 API 总结

    现在关于天气预报的手机应用是非常的多 包括那些非常著名的应用 我就不指名了 大家应该都用过 我就纳了闷了 一个预报天气的应用把天气好好的预报了就得了呗 非得加那么多没有用的功能 弄得应用本身越来越臃肿 而且速度越来越慢 你们到底要干什么吗
  • 最大正方形(前缀和)

    原题链接 题目描述 在一个 n m 的只包含 0 和 1 的矩阵里找出一个不包含 0 的最大正方形 输出边长 输入描述 输入文件第一行为两个整数 n m 1 lt n m lt 100 接下来 n 行 每行 m 个数字 用空格隔开 0 或
  • 2022年5月25 面试记录

    2022年5月25日 天气雨转晴 约的下午两点半面试11点出发的一点到的公司门口 他们在午休时间 我看前台右侧走廊有小沙发就索性坐在那等 一边记单例模式 是在一个园区 3栋五楼 同着的还有三家其他的企业 对门好像是做运输的 上午上了两节课
  • 多台电脑环境下Python统一相同的库及对应版本

    工作时很容易遇到这种情况 就是公司电脑和个人电脑Python中对应的库的版本甚至种类不同 这样就可能导致用个人电脑编写的代码在公司电脑上跑不了 或者别的什么原因需要统一版本库 可以通过以下方式解决 当然有别的方式 例如Docker 首先 在

随机推荐

  • CentOS 7 开放3306端口(实现MySQL远程登陆)

    一 开放3306端口 1 开启端口3306 firewall cmd zone public add port 3306 tcp permanent 2 重启防火墙 firewall cmd reload 3 查看已经开放的端口 firew
  • ajax的使用 json格式传参

    json格式被认为进行ajax前后端交互比较方便 这里就贴上前端js的相关代码 首先绑定一个按钮 被点击时触发ajax方法 sendEmail btn on click function ajax type post 请求类型为post 关
  • 微服务项目nginx前后台配置实例

    微服务项目nginx配置实例 1 准备好nginx服务我本地版本是nginx 1 18 0 zip 2 将前台代码放入nginx html目录下 3 将修改config nginx conf文件 user nobody worker pro
  • ubuntu问题g++ : 依赖: g++-4.8 (>= 4.8.2-5~) 但是它将不会被安装

    截图中选取了一个等同的例子 python dev 依赖 libpython dev 2 7 5 5ubuntu3 但是它将不会被安装 凡是遇到类似问题 括号里面会是一些版本号 这通常代表的意思是Ubuntu自生安装的软件包版本高 而所安装软
  • [非线性控制理论]4_反馈线性化_反步法

    非线性控制理论 1 Lyapunov直接方法 非线性控制理论 2 不变性原理 非线性控制理论 3 基础反馈稳定控制器设计 非线性控制理论 4 反馈线性化 反步法 非线性控制理论 5 自适应控制器 Adaptive controller 非线
  • C语言编译器

    C语言编译器是指用于将C语言源代码转换成可执行程序的工具软件 编译器将C语言源程序转化为目标代码的过程称为编译 目标代码通常是机器码 可由计算机直接执行 常见的C语言编译器有 GCC GNU Compiler Collection GNU编
  • 【C++入门】文件流(fstream)介绍和使用

    1 打开函数 open mode 含义 ios in 以读取方式打开文件 ios out 以写入方式打开文件 ios binary 以二进制方式存取 ios ate 存取指针在文件末尾 ios app 写入时采用追加方式 ios trunc
  • 一个 SPI 转串口驱动的优化

    rel File List href file C 5CDOCUME 7E1 5Czjujoe 5CLOCALS 7E1 5CTemp 5Cmsohtml1 5C01 5Cclip filelist xml gt 一个 SPI 转串口驱动的
  • JavaScript动态加载CSS的三种方法

    JavaScript动态加载CSS的三种方法 CSDN Blog推出文章指数概念 文章指数是对Blog文章综合评分后推算出的 综合评分项分别是该文章的点击量 回复次数 被网摘收录数量 文章长度和文章类型 满分100 每月更新一次 如果你有很
  • 程序员也要学英语——印欧语音变规律总结

    目录 一 印欧语音变规律 二 口诀汇总 三 元音互换 a e i o u w y 1 词根 uni 一 统一 2 词根 tri 三 四 u v w 1 词根 nov 新 2 词根 vol 意愿 五 b p m f v 1 词根 bene 好
  • U3D打包DLL插件 DLL Builder

    前面的文章讲过如何通过cmd打包dll文件 文章链接 实际中 需求一般是很多文件需要打包到一个dll时 此时 一个一个添加打包吗 这里介绍一个很不错的插件 DLL Builder 商店地址 九块九 包邮 这是一个可视化的dll打包工具 可以
  • 小米SOAR

    小米soar工具安装 系统Ubuntu 18 04 更新下apt get包 防止报错 sudo apt get update sudo apt get install sudo apt get upgrade 安装Go语言 sudo apt
  • 如何在C语言中进行字符串的查找操作?

    首先 要进行字符串的查找操作 我们需要使用到C语言中的字符串函数 这些函数包括strlen strcmp strcat strcpy strstr 等等 它们可以实现字符串的长度计算 比较 拼接 复制 查找等操作 如果要在一个字符串中查找另
  • git clone和直接下载压缩包的区别

    目录 一 区别 一 区别 Git是公司开发中必不可少的一项基础技能 很多大型企业经常会有自己的内网 在内网直接下载压缩包后 写完业务后在进行远程ssh的绑定是无法绑定上的 因为公司内网对这种绑定作出了限制 而上司邀请你有开发权限后 直接使用
  • C++ main函数中参数argc和argv含义及用法( argument count和 argument vector)

    rgc 是 argument count的缩写 表示传入main函数的参数个数 argv 是 argument vector的缩写 注意 不是argument value的缩写 自己以前理解错了 表示传入main函数的参数序列或指针 并且第
  • Paxos与2PC

    Paxos与2PC Paxos协议和2PC协议在分布式系统中所起的作用并不相同 Paxos协议用于保证同一个数据分片的多个副本之间的数据一致性 当这些副本分布到不同的数据中心时 这个需求尤其强烈 2PC协议用于保证属于多个数据分片上的操作的
  • Winclone Pro for Mac(Windows分区备份还原工具)

    Winclone Pro for Mac一款Windows分区备份还原工具 winclone pro mac版保护您的Boot Camp Windows系统免受数据丢失以及将Boot Camp分区移动到新Mac的完整解决方案 Winclon
  • java返回值float_Java Float类的compare()方法与示例

    Float类compare 方法compare 方法在java lang包中可用 compare 方法用于检查给定两个浮点值的相等或不相等 换句话说 可以说此方法用于比较两个浮点值 compare 方法是一个静态方法 也可以使用类名进行访问
  • 爬虫手册05 异步爬虫

    异步爬虫 目标 例举asyncio和aiohttp模块的常规用法代码 关于协程概念参考 https blog csdn net weixin 40743639 article details 122394616 spm 1001 2014
  • 线程安全同步问题

    需求 模拟3个窗口同时在售50张 票 问题1 为什么50张票被卖出了150次 出现 的原因 因为num是非静态的 非静态的成员变量数据是在每个对象中都会维护一份数据的 三个线程对象就会有三份 解决方案 把num票数共享出来给三个线程对象使用