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

JAVA同步代码块 同步方法

JAVA同步代码块 & 同步方法

为了解决多线程操作共享数据时产生的安全问题

例如以下代码

if (ticket <= 0) {// 卖完了break;
} else {ticket--;System.out.println(Thread.currentThread().getName() + "在卖票,还剩下" + ticket + "张");
}

如果两个线程同时执行以上方法,同时访问或修改共享的变量ticket,就有可能会出现安全问题。

例如:

出现重复票

窗口三在卖票,还剩下98张
窗口一在卖票,还剩下98张
窗口一在卖票,还剩下96张
窗口三在卖票,还剩下95张
窗口二在卖票,还剩下95

原因:几个线程可能同时执行System.out.println(Thread.currentThread().getName() + "在卖票,还剩下" + ticket + "张");

出现负数票

窗口一在卖票,还剩下0张
窗口三在卖票,还剩下-1

原因:两个线程都在执行else语句前检查了ticket是大于0的。

JAVA中,可以使用同步代码块同步方法来解决以上问题。

同步代码块

为了解决以上问题,可以使用同步代码块实现锁定多条语句,以独立操作共享数据。

格式:

synchronized(任意对象) {多条语句操作共享数据的代码
}

需要对象作为一个锁,只要有一个线程进去执行代码了,这个对象就会被锁住。
当线程执行完出来了,才会自动为这个对象解锁。
若对象被锁住了,线程就无法继续执行,直到这个对象被解锁。

因此,为了使只能同时有一个线程执行语句,只能是同一个对象作为synchronized的参数。

相当于一个房间只有一个门,有一个线程进去了就会锁上门,其他线程进不去。完成后再出门解锁。
若多个线程synchronized的参数是几个不同的对象,就相当于一个房间有几个门,各自都可以通过自己的门进出,起不到隔离的作用。

修改后的代码如下

public class Ticket implements Runnable {// 票的对象private int ticket = 100;private Object obj = new Object();public void run() {while (true) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}synchronized (obj) {if (ticket <= 0) {// 卖完了break;} else {ticket--;System.out.println(Thread.currentThread().getName() + "在卖票,还剩下" + ticket + "张");}}}}
}
public class demo {public static void main(String[] args) {Ticket ticket = new Ticket();Thread t1 = new Thread(ticket);Thread t2 = new Thread(ticket);Thread t3 = new Thread(ticket);t1.setName("窗口一");t2.setName("窗口二");t3.setName("窗口三");t1.start();t2.start();t3.start();}
}

同步方法

与同步代码块不同的是,同步方法不需要指定锁对象,而且同步方法可以锁住方法中所有代码,故同时只能有一个线程运行同步方法中的代码。

格式:

修饰符 synchronized 返回值类型 方法名(方法参数) {}

使用示例如下:

public class Ticket implements Runnable {// 票的对象private int ticket = 100;public void run() {while (true) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}if (soldout()) {break;}}}public synchronized boolean soldout() {if (ticket <= 0) {// 卖完了return true;} else {ticket--;System.out.println(Thread.currentThread().getName() + "在卖票,还剩下" + ticket + "张");}return false;}
}

运行结果:

/Library/Java/JavaVirtualMachines/jdk-19.jdk/Contents/Home/bin/java -javaagent:/Users/doubleq666/Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/223.8617.56/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=61509:/Users/doubleq666/Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/223.8617.56/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath /Users/doubleq666/Documents/IdeaProjects/Semaphore/Semaphore/out/production/Semaphore SynchronizedDemo.demo
窗口一在卖票,还剩下99张
窗口三在卖票,还剩下98张
窗口二在卖票,还剩下97张
窗口二在卖票,还剩下96张
窗口三在卖票,还剩下95张
窗口一在卖票,还剩下94张
窗口二在卖票,还剩下93张
窗口三在卖票,还剩下92张
窗口一在卖票,还剩下91张
窗口三在卖票,还剩下90张
窗口一在卖票,还剩下89张
窗口二在卖票,还剩下88张
窗口二在卖票,还剩下87张
窗口三在卖票,还剩下86张
窗口一在卖票,还剩下85张
窗口三在卖票,还剩下84张
窗口一在卖票,还剩下83张
窗口二在卖票,还剩下82张
窗口二在卖票,还剩下81张
窗口三在卖票,还剩下80张
窗口一在卖票,还剩下79张
窗口二在卖票,还剩下78张
窗口三在卖票,还剩下77张
窗口一在卖票,还剩下76张
窗口二在卖票,还剩下75张
窗口三在卖票,还剩下74张
窗口一在卖票,还剩下73张
窗口二在卖票,还剩下72张
窗口三在卖票,还剩下71张
窗口一在卖票,还剩下70张
窗口二在卖票,还剩下69张
窗口一在卖票,还剩下68张
窗口三在卖票,还剩下67张
窗口二在卖票,还剩下66张
窗口一在卖票,还剩下65张
窗口三在卖票,还剩下64张
窗口二在卖票,还剩下63张
窗口一在卖票,还剩下62张
窗口三在卖票,还剩下61张
窗口二在卖票,还剩下60张
窗口一在卖票,还剩下59张
窗口三在卖票,还剩下58张
窗口二在卖票,还剩下57张
窗口一在卖票,还剩下56张
窗口三在卖票,还剩下55张
窗口二在卖票,还剩下54张
窗口一在卖票,还剩下53张
窗口三在卖票,还剩下52张
窗口二在卖票,还剩下51张
窗口一在卖票,还剩下50张
窗口三在卖票,还剩下49张
窗口二在卖票,还剩下48张
窗口一在卖票,还剩下47张
窗口三在卖票,还剩下46张
窗口二在卖票,还剩下45张
窗口三在卖票,还剩下44张
窗口一在卖票,还剩下43张
窗口二在卖票,还剩下42张
窗口三在卖票,还剩下41张
窗口一在卖票,还剩下40张
窗口二在卖票,还剩下39张
窗口三在卖票,还剩下38张
窗口一在卖票,还剩下37张
窗口二在卖票,还剩下36张
窗口三在卖票,还剩下35张
窗口一在卖票,还剩下34张
窗口二在卖票,还剩下33张
窗口三在卖票,还剩下32张
窗口一在卖票,还剩下31张
窗口二在卖票,还剩下30张
窗口三在卖票,还剩下29张
窗口一在卖票,还剩下28张
窗口二在卖票,还剩下27张
窗口三在卖票,还剩下26张
窗口一在卖票,还剩下25张
窗口二在卖票,还剩下24张
窗口三在卖票,还剩下23张
窗口一在卖票,还剩下22张
窗口二在卖票,还剩下21张
窗口三在卖票,还剩下20张
窗口一在卖票,还剩下19张
窗口二在卖票,还剩下18张
窗口三在卖票,还剩下17张
窗口一在卖票,还剩下16张
窗口二在卖票,还剩下15张
窗口三在卖票,还剩下14张
窗口一在卖票,还剩下13张
窗口二在卖票,还剩下12张
窗口三在卖票,还剩下11张
窗口一在卖票,还剩下10张
窗口二在卖票,还剩下9张
窗口三在卖票,还剩下8张
窗口一在卖票,还剩下7张
窗口二在卖票,还剩下6张
窗口三在卖票,还剩下5张
窗口一在卖票,还剩下4张
窗口二在卖票,还剩下3张
窗口三在卖票,还剩下2张
窗口一在卖票,还剩下1张
窗口二在卖票,还剩下0Process finished with exit code 0

相关文章:

JAVA同步代码块 同步方法

JAVA同步代码块 & 同步方法 为了解决多线程操作共享数据时产生的安全问题 例如以下代码 if (ticket < 0) {// 卖完了break; } else {ticket--;System.out.println(Thread.currentThread().getName() "在卖票&#xff0c;还剩下" ticket "张")…...

分享111个助理类简历模板,总有一款适合您

分享111个助理类简历模板&#xff0c;总有一款适合您 111个助理类简历模板下载链接&#xff1a;https://pan.baidu.com/s/1JafYuLPQMmq37K4V0wiqWA?pwd8y54 提取码&#xff1a;8y54 Python采集代码下载链接&#xff1a;https://wwgn.lanzoul.com/iKGwb0kye3wj 设计师助理…...

Allegro如何更改临时高亮的颜色设置操作指导

Allegro如何更改临时高亮的颜色设置操作指导 在用Allegro做PCB设计的时候,当移动或者高亮某个对象之前,会被临时高亮一个颜色,方便查看,类似下图 运行高亮命令的时候,器件被临时高亮成了白色 软件默认的是白色,如何更改成其它颜色? 具体操作如下 点击Display选择Color…...

知识图谱嵌入技术研究综述

作者 张天成 1 , * 田 雪 1 , * 孙相会 1 , * 于明鹤 2 , * 孙艳红 1 , * 于 戈 摘要 知识图谱 是一种用图模型来描述知识和建模事物之间的关联关系的技术。 知识图谱嵌入 作为一种被广泛采用的知识表示方法。 主要思想是将知识图谱中的实体和关系嵌入到连续的向量空间中…...

Scratch少儿编程案例-水果忍者-超完整

专栏分享 点击跳转=>Unity3D特效百例点击跳转=>案例项目实战源码点击跳转=>游戏脚本-辅助自动化点击跳转=>Android控件全解手册点击跳转=>Scratch编程案例👉关于作者...

练 习

1.判断三个中最重的//依次输入相应的人的体重double people1, people2, people3;cout << "请输入第一个人体重" << endl;cin >> people1;cout << "请输入第二个人体重" << endl;cin >> people2;cout << "请…...

Urho3D整体结构

Urho3D引擎编译成一个库。从概念上讲&#xff0c;它由几个代表不同子系统或功能的“子库”组成。其中每个都位于Source/Urho3D目录下的子目录中&#xff1a; 容器:提供STL替换类和共享指针。数学:提供相交测试中使用的矢量、四元数和矩阵类型以及几何形状。Core:提供执行上下文…...

大数据技术之Hudi

Hudi概述 1.1 Hudi简介 Apache Hudi&#xff08;Hadoop Upserts Delete and Incremental&#xff09;是下一代流数据湖平台。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的upserts/delete、高级索引、流摄取服务、数据集群/压缩优化和并发&a…...

libxlsxwriter条件格式

今天来看一个libxlsxwriter的高级用法&#xff1a;一个条件格式的示例。 说它“高级”&#xff0c;也是基于非Excel专家的小白们的视角。对&#xff0c;没错&#xff0c;本小白正是这样的小白。 1 一个简单的问题 来看我们今天的场景问题&#xff1a;有一列数据&#xff0c;有…...

nodejs+vue+elementui在线求助系统vscode

目 录 摘 要 1 前 言 3 第1章 概述 4 1.1 研究背景 4 1.2 研究目的 4 1.3 研究内容 4 第二章 开发技术介绍 5 前端技术&#xff1a;nodejsvueelementui,视图层其实质就是vue页面&#xff0c;通过编写vue页面从而展示在浏览器中&#xff0c;编写完成的vue页面要能够和控制器类进…...

电子技术——BJT差分输入对

电子技术——BJT差分输入对 本节我们来讨论BJT差分输入对。 共模输入 下图是BJT差分输入对的基本原理图&#xff1a; 首先我们考虑两端输入共模信号 VCMV_{CM}VCM​ &#xff1a; 此时 vB1vB2VCMv_{B1} v_{B2} V_{CM}vB1​vB2​VCM​ 因为电路的对称结构&#xff0c;所以 i…...

[MySQL教程②] - MySQL介绍和发展史

目录 ❤ MySQL介绍 ❤ 什么是数据库 ❤ 什么是数据 ❤ 数据库管理系统 ❤ NoSQL特性总览 ❤ NoSQL的分类、特点、典型产品 ❤ 常见的数据库产品有哪些&#xff1f; ❤ Oracle公司产品介绍 Oracle数据库版本介绍 Oracle的市场应用 MySQL数据库版本介绍 MyS…...

多表查询--实例

1 创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); 创建score表。SQL代码如下&#xff1a; CREATE TABLE score ( id INT…...

Differentially Private Grids for Geospatial Data

文章目录abstractintroabstract 在本文中&#xff0c;我们解决了为二维数据集(如地理空间数据集)构建差异私有概要的问题。目前最先进的方法通过执行数据域的递归二进制分区和构造分区的层次结构来工作。我们表明&#xff0c;基于分区的概要方法的关键挑战在于选择正确的分区粒…...

Java学习记录day8

类与对象 继承例题 https://www.bilibili.com/video/BV1PU4y1E7nX?p55&vd_source8f80327daa664c039f5c342a25bcbbae&#xff08;B站千峰马剑威Java基础入门视频第P55&#xff0c;记录的重要学习内容之一&#xff09; final关键字 作用&#xff1a; 声明一个常量&…...

Solon2 开发之容器,三、注入或手动获取 Bean

1、如何注入Bean&#xff1f; 先了解一下Bean生命周期的简化版&#xff1a; 运行构建函数尝试字段注入&#xff08;有时同步注入&#xff0c;没时订阅注入。不会有相互依赖而卡住的问题&#xff09;Init 函数&#xff08;是在容器初始化完成后才执行&#xff09;…释放&#…...

微信小程序_调用openAi搭建虚拟伙伴聊天

微信小程序_调用openAi搭建虚拟伙伴聊天背景效果关于账号注册接口实现8行python搞定小程序实现页面结构数据逻辑结速背景 从2022年的年底&#xff0c;网上都是chagpt的传说&#xff0c;个人理解这个chatgpt是模型优化训练&#xff0c;我们在用chatgpt的时候就在优化这个模型&a…...

硬件工程师入门基础知识(一)基础元器件认识(一)

硬件工程师入门基础知识 &#xff08;一&#xff09;基础元器件认识&#xff08;一&#xff09; 今天水一篇hhh。介绍点基础但是实用的东西。 tips&#xff1a;学习资料和数据来自《硬件工程师炼成之路》、百度百科、网上资料。 1.贴片电阻 2.电容 3.电感 4.磁珠 1.贴片电…...

TCP的运输连接管理

TCP的运输连接管理 文章目录TCP的运输连接管理TCP报文格式简介首部各个字段的含义控制位(flags)TCP的连接建立抓包验证一些细节及解答TCP连接释放抓包验证一些细节及解答参考TCP是面向连接的协议。运输连接是用来传送TCP报文的。TCP运输连接的建立和释放时每一次面向连接的通信…...

地级市用电、用水、用气数据指标

用电用水量和煤气及液化石油气供应及利用情况可以反映出城市基础设施的建设情况&#xff01;之前我们基于历年的《中国城市统计年鉴》整理了1999—2020年的人口数量数据指标、人口变动数据指标、用地相关数据指标、污染物排放和环境治理相关数据指标、地区生产总值及一二三产构…...

安装deepinlinuxV20.8配置docker和vscode开发c语言

# 重装的原因 某个开发任务时&#xff0c;发现需要glibc2.25,本机版本比较低&#xff0c;就下载源码configure make makeinstall&#xff0c;结果失败了&#xff0c; 看来与系统用的glibc有冲突&#xff0c;造成部分库版本不一致&#xff0c;打开终端出现段错误&#x…...

java08-面向对象3

一&#xff1a;static 关键字&#xff1a;静态的 1.可以用来修饰的结构:主要用来修饰类的内部结构 属性、方法、代码块、内部类 2. static 修饰属性&#xff1a;静态变量&#xff08;或类变量&#xff09; 2.1 属性&#xff0c;是否使用static修饰&#xff0c;又分为静态属…...

【Spark分布式内存计算框架——Spark Core】8. 共享变量

第七章 共享变量 在默认情况下&#xff0c;当Spark在集群的多个不同节点的多个任务上并行运行一个函数时&#xff0c;它会把函数中涉及到的每个变量&#xff0c;在每个任务上都生成一个副本。但是&#xff0c;有时候需要在多个任务之间共享变量&#xff0c;或者在任务(Task)和…...

C++多态常见面试题

1.什么是多态 简单点说&#xff0c;就是多种形态&#xff0c;具体就是完成某个行为&#xff0c;当不同的对象去完成时产生的不同形态。多态分为静态多态和动态多态&#xff0c;静态多态一般指的是函数重载&#xff0c;在编译阶段通过函数名修饰规则&#xff0c;不同类型调用不同…...

字母板上的路径 题解,力扣官方出来挨打(小声)

字母板上的路径 我们从一块字母板上的位置 (0, 0) 出发&#xff0c;该坐标对应的字符为 board[0][0]。 在本题里&#xff0c;字母板为board [“abcde”, “fghij”, “klmno”, “pqrst”, “uvwxy”, “z”]&#xff0c;如下所示。 我们可以按下面的指令规则行动&#xff1a…...

代码随想录算法训练营第二十六天 | 39. 组合总和,40.组合总和II,131.分割回文串

一、参考资料组合总和题目链接/文章讲解&#xff1a;https://programmercarl.com/0039.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8C.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1KT4y1M7HJ 组合总和II题目链接/文章讲解&#xff1a;https://programmercarl.com/004…...

vueday01-脚手架安装详细

一、vue脚手架安装命令npm i -g vue/cli 或 yarn global add vue/cli安装上面的工具&#xff0c;安装后运行 vue --version &#xff0c;如果看到版本号&#xff0c;说明安装成功或 vue -V工具安装好之后&#xff0c;就可以安装带有webpack配置的vue项目了。创建项目之前&#…...

初识cesium3d(一)

使用ViteVue3.2Cesium。Vite需要Node.js版本14.18及以上版本。Vite命令创建的工程会自动生成vite.config.js文件&#xff0c;来配置一些相关的参数。 1、使用Vite创建vue3项目 # npm npm init vitelatest cesium-app -- --template vue # yarn yarn create vite cesium-app…...

点云转3D网格【Python】

推荐&#xff1a;使用 NSDT场景设计器 快速搭建 3D场景。 在本文中&#xff0c;我将介绍我的 3D 表面重建过程&#xff0c;以便使用 Python 从点云快速创建网格。 你将能够导出、可视化结果并将结果集成到您最喜欢的 3D 软件中&#xff0c;而无需任何编码经验。 此外&#xff0…...

【OpenCV图像处理系列一】OpenCV开发环境的安装与搭建(Ubuntu + Window都适用)

&#x1f517; 运行环境&#xff1a;OpenCV&#xff0c;Ubuntu&#xff0c;Windows &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x…...

做天然文化石的网站/chrome浏览器官网入口

很多用户在购买完3TB(4T,6T,8T等硬盘同样适用本方法&#xff0c;以下简称3T)以上硬盘回家后&#xff0c;装上机器时会显示硬盘容量被“偷走”746GB&#xff0c;这究竟是什么原因呢&#xff1f;在这里我们先了解一下&#xff0c;为什么硬盘在Win7系统中也会有容量限制&#xff1…...

2019年做网站还有前景吗/班级优化大师免费下载学生版

库 database 库 tabale创建 create空 null 非空 not null默认&#xff0c;展示 select之前 firstt 之后 after修改 modify改变 change键 index自动附值 auto_incremen...

wordpress里面的附件如何导出/百度学术查重

AOP为Aspect OrientedProgramming的缩写&#xff0c;意为面向切面编程。那什么又是面向切面&#xff1f;它与仅有一字之差的OOP又有着什么样的区别与联系&#xff1f;所谓的面向切面编程其实是对业务逻辑又进行了进一步的抽取&#xff0c;将多种业务逻辑中的公用部分抽取出来做…...

网站文案编辑怎么做/爱站网长尾关键词挖掘工具下载

1、linux普通用户默认密码策略&#xff1a;用passwd修改用户密码&#xff0c;常常提示“BAD PASSWORD: it is based on a dictionary word”。实际上linux要求的密码验证机制是在/etc/login.defs中规定最小密码字符数&#xff1b;同时还要受到/etc/pam.d/passwd的限定。但是在r…...

做英语阅读的网站/怎样做网站

今天做网站【标签】筛选功能时&#xff0c;出现了这么个奇葩的问题。 我是直接通过<a>标签中href来跳转的&#xff0c;url中包含汉字 <a href"/tags/标签A">标签A</a> 后台代码是这样的&#xff1a; RequestMapping(value "/tags/{tagname}&…...

个人域名备案网站名称/接单平台app

第1章 第2章 第3章 第4章 第5章 第6章 第7章 第8章 第9章 第10章 第11章 第12章 第13章 第14章 第15章 第16章 第17章...