Java之多线程-同步代码块

线程同步

Java中提供了线程同步的机制,来解决上述的线程安全问题。

Java中实现线程同步,主要借助synchronized关键字实现。

线程同步方式:

  • 同步代码块

  • 同步方法

  • 锁机制

1)同步代码块

格式:

//Object类及其子类对象都可以作为 线程同步锁对象 使用
synchronized(mutex锁对象) {//需要同步操作的代码//...
}

案例:

​ 使用线程同步代码块,解决上述案例Bug

package com.briup.chap10;class TicketRunnable2 implements Runnable {//待售票数量private int num = 50;//准备锁对象【多个线程必须使用相同锁对象】Object mutex = new Object();@Overridepublic void run() {while(true) {//同步代码块:固定书写格式,需要使用同一把锁//线程执行流程://	1.线程成功抢占到共享资源mutex(上锁成功),才能进入代码块执行//	  其他抢占资源失败的线程,则进入阻塞状态//	2.同步代码执行完成,该线程自动释放共享资源(解锁)//	  其他线程由阻塞转入就绪状态,重新抢占资源(上锁)synchronized (mutex) {//如果待售数量 小于0,跳出循环,线程结束if(num <= 0)break;//输出信息:模拟卖票String name = Thread.currentThread().getName();System.out.println(name + " 正在卖票,编号:" + num);//编号自减num--;//每隔50ms 销售 一张票【sleep放下面是为了更好的输出效果】try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}}}}
}public class Test16_CodeBlock {public static void main(String[] args) {Runnable r = new TicketRunnable2();Thread t1 = new Thread(r,"1号窗口");Thread t2 = new Thread(r,"2号窗口");Thread t3 = new Thread(r,"3号窗口");t1.start();t2.start();t3.start();}
}

注意,要实现线程同步,必须满足下面2个条件:

  • 所有线程都需要参与线程同步
  • 所有线程必须使用同一个锁对象

运行效果:

在这里插入图片描述

多次运行,观察效果可知,之前的2个问题都已经成功解决!

线程同步理解:

//线程只有竞争到锁,才能执行同步代码块中代码(上锁)
synchronized(mutex锁对象) {需要同步操作的代码//程序执行流程离开该代码块,则自动释放锁(解锁)//离开含多种情况,正常出右大括号,break、return或遇到异常跳出
}

线程同步可理解成一个规则(进卫生间必须竞争到钥匙开门,离开卫生间必须锁门交出钥匙)

  • 所有的线程都遵循这种规则,才能同步成功

  • 如果个别线程不遵循规则(不用钥匙,翻窗进入),则无法实现同步

锁对象可以理解成保证线程同步的重要因素(打开卫生间门的唯一钥匙)

  • 多个线程使用同一把锁(用唯一的钥匙开门),才能保证线程同步

  • 如果使用不同的锁(不同的人用不同的钥匙去开门),则也无法实现线程同步效果

线程状态图为:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1489070.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Flink笔记整理(五)

Flink笔记整理&#xff08;五&#xff09; 文章目录 Flink笔记整理&#xff08;五&#xff09;七、处理函数&#xff08;最底层最常用最灵活&#xff09;7.1基本处理函数&#xff08;ProcessFunction&#xff09;处理函数的功能和使用ProcessFunction解析 7.2按键分区处理函数&…

数据结构 Day2 链式存储

线性表的链式存储 解决顺序存储的缺点&#xff0c;插入和删除&#xff0c;动态存储问题。特点&#xff1a;线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素&#xff0c;存储单元可以是连续的&#xff0c;也可以不连续。可以被存储在任意内存未被占用的位置上…

JavaScript Let

ECMAScript 2015 ES2015 引入了两个重要的 JavaScript 新关键词&#xff1a;let 和 const。 这两个关键字在 JavaScript 中提供了块作用域&#xff08;Block Scope&#xff09;变量&#xff08;和常量&#xff09;。 在 ES2015 之前&#xff0c;JavaScript 只有两种类型的作…

【数据库】联合索引在b+树如何存储

什么是联合索引&#xff1f; 联合索引是一种数据库索引类型&#xff0c;它允许你基于表中两个或多个列的组合来创建索引。这种索引可以提高数据库查询的性能&#xff0c;特别是当查询条件涉及到这些列时。 如&#xff1a; create index id_name_age out users(name,age) 索引…

算法刷题day20|回溯:39. 组合总和、40. 组合总和 II、131. 分割回文串

39. 组合总和 回溯 class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& candidates, int target, int sum, int startIndex) {if (sum > target) {return;}if (sum target) {result.push…

C#、Net6、WebApi报表方案

目录 1 Pdf表单方案 1.1出现如下错误提示: 1.2 字体路径使用 2 Docx报表模板方案 2.1 pdf方案缺陷 2.2 解决方案 3 Spire.Doc报表方案 3.1 Docx方案缺陷 3.2 解决方案 4 插入复选框 5 WebApi文件流下载接口 6 软件获取方式 1 Pdf表单方案 使用【Adobe Acrobat P…

Python 爬虫入门(一):从零开始学爬虫 「详细介绍」

Python 爬虫入门&#xff08;一&#xff09;&#xff1a;从零开始学爬虫 「详细介绍」 前言1.爬虫概念1.1 什么是爬虫&#xff1f;1.2 爬虫的工作原理 2. HTTP 简述2.1 什么是 HTTP&#xff1f;2.2 HTTP 请求2.3 HTTP 响应2.4 常见的 HTTP 方法 3. 网页的组成3.1 HTML3.1.1 HTM…

掀桌子了!原来是咱们的大屏设计太酷,吓着前端开发老铁了

掀桌子了&#xff01;原来是咱们的大屏设计太酷&#xff0c;吓着前端开发老铁了 艾斯视觉观点认为&#xff1a;在软件开发的世界里&#xff0c;有时候创意和设计的火花会擦得特别亮&#xff0c;以至于让技术实现的伙伴们感到既兴奋又紧张。这不&#xff0c;我们的设计团队刚刚…

SpringBoot入门实战:SpringBoot整合Shiro

1.背景介绍 SpringBoot是一个用于快速开发Spring应用程序的框架。它的核心是对Spring框架的一层封装&#xff0c;使其更加简单易用。SpringBoot整合Shiro是一种将SpringBoot与Shiro整合的方法&#xff0c;以实现身份验证和授权功能。 Shiro是一个强大的Java安全框架&#xff0c…

matlab笔记 - 最小二乘法拟合直线的原理与实现

最小二乘法拟合直线原理与实现 一、引言二、原理概述1. 建模思路2.误差函数3.求解最优参数 三、matlab实现最小二乘法拟合直线1.直接代码实现2.MATLAB内置函数实现 四、扩展统计学与回归分析经济学工程学图像处理机器学习 一、引言 最小二乘法&#xff08;Least Squares Metho…

鸿蒙APP架构及开发入门

1.鸿蒙系统 1.1 什么是鸿蒙 鸿蒙是一款面向万物互联时代的、全新的分布式操作系统。 在传统的单设备系统能力基础上&#xff0c;鸿蒙提出了基于同一套系统能力、适配多种终端形态的分布式理念&#xff0c;能够支持手机、平板、智能穿戴、智慧屏、车机、PC、智能音箱、耳机、…

超燃!纯AI生成《泰坦尼克号》大片!浙大阿里发布MovieDreamer:超长电影生成“梦工厂“

论文链接&#xff1a;https://arxiv.org/pdf/2407.16655 项目主页&#xff1a;https://aim-uofa.github.io/MovieDreamer/ github链接&#xff1a;https://github.com/aim-uofa/MovieDreamer 亮点直击 MovieDreamer&#xff0c;一个新颖的分层框架&#xff0c;将自回归模型与扩…

正则表达式与文本处理

目录 一、正则表达式 1、正则表达式定义 1.1正则表达式的概念及作用 1.2、正则表达式的工具 1.3、正则表达式的组成 2、基础正则表达式 3、扩展正则表达式 4、元字符操作 4.1、查找特定字符 4.2、利用中括号“[]”来查找集合字符 4.3、查找行首“^”与行尾字符“$”…

前端江湖:从菜鸟到大侠的修炼手册

在这个数字编织的梦幻世界里&#xff0c;前端&#xff0c;这个听起来就带着几分仙气与神秘感的词汇&#xff0c;实则是每一位互联网探险家手中的魔法杖。它不仅连接着代码的冰冷逻辑与用户的炽热情感&#xff0c;更在无数次的点击与滑动间&#xff0c;绘制出一幅幅绚丽多彩的交…

通过IP获取对应的经纬度地区

背景 项目现在要通过IP获取对应的地区和经纬度。后面会根据经纬度在地图上展示 直接用大佬给出的ip-info 这是大佬给的项目地址 https://gitee.com/jthinking/ip-info这是运行实例 感谢大佬打赏 ![在这里插入图片描述]

怎样在 Nginx 中配置基于请求客户端指纹识别数据的路由?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 怎样在 Nginx 中配置基于请求客户端指纹识别数据的路由 怎样在 Nginx 中配置基于请求客户端指纹识别数据的路由 在当今数字化的世界中&#xff0c;网站和应用程…

谷粒商城实战笔记-69-商品服务-API-品牌管理-JSR303自定义校验注解

文章目录 1. 需求介绍2. 创建自定义校验注解2.1 编写自定义校验注解2.1.1 注解定义2.1.2 配置文件 3. 实现自定义校验器3.1 编写自定义校验器 4. 使用自定义校验5. 多类型校验器的支持6. 测试 上一节讲解了如何使用分组校验。 这一节将详细介绍如何在Java中实现自定义校验注解以…

步进电机常见的三种驱动方式

步进电机是一种作为控制用的特种电机, 它的旋转是以固定的角度(称为"步距角")一步一步运行的, 其特点是没有积累误差( 为100%), 所以广泛应用于各种开环控制。 步进电机的运行要有一电子装置进行驱动, 这种装置就是步进电机驱动器, 它是把控制系统发出的脉冲信号转化…

宝塔单ip,新建多站点

报错如上&#xff1a; 那么如何新建多站点呢 先随便写个名字上去&#xff0c;然后再重新绑定别的端口… 这个时候访问99端口即可 。 如果是有域名&#xff0c;则不需要这样做 、直接80端口也可以多站点