Java之多线程-同步代码块

news2024/9/21 2:50:40

线程同步

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

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

线程同步方式:

  • 同步代码块

  • 同步方法

  • 锁机制

1)同步代码块

格式:

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

案例:

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

package com.briup.chap10;

class TicketRunnable2 implements Runnable {
	//待售票数量
	private int num = 50;
	
	//准备锁对象【多个线程必须使用相同锁对象】
	Object mutex = new Object();
	
	@Override
	public 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.coloradmin.cn/o/1951348.html

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

相关文章

Web网页端IM产品RainbowChat-Web的v7.1版已发布

一、关于RainbowChat-Web RainbowChat-Web是一套Web网页端IM系统&#xff0c;是RainbowChat的姊妹系统&#xff08;RainbowChat是一套基于开源IM聊天框架 MobileIMSDK (Github地址) 的产品级移动端IM系统&#xff09;。 ► 详细介绍&#xff1a;http://www.52im.net/thread-2…

研发(RD)注意事项 / 复杂项目规划、控制方法 PERT 和 CPM

注&#xff1a;机翻&#xff0c;未校对&#xff0c;去掉了原文中广告。 What Is Research and Development (R&D)? 什么是研发&#xff08;R&D&#xff09;&#xff1f; Investopedia / Ellen Lindner Research and Development An ongoing effort to develop or impr…

Spring Boot入门指南:留言板

一.留言板 1.输⼊留⾔信息,点击提交.后端把数据存储起来. 2.⻚⾯展⽰输⼊的表⽩墙的信息 规范&#xff1a; 1.写一个类MessageInfo对象&#xff0c;添加构造方法 虽然有快捷键&#xff0c;但是还是不够偷懒 项目添加Lombok。 Lombok是⼀个Java⼯具库&#xff0c;通过添加注…

Java | Leetcode Java题解之第283题移动零

题目&#xff1a; 题解&#xff1a; class Solution {public void moveZeroes(int[] nums) {int n nums.length, left 0, right 0;while (right < n) {if (nums[right] ! 0) {swap(nums, left, right);left;}right;}}public void swap(int[] nums, int left, int right)…

AI/机器学习(计算机视觉/NLP)方向面试复习3

1. Pooling 有哪些方式&#xff1f;pytorch的实现&#xff1f; Pooling可以分成&#xff1a;最大池化&#xff0c;平均池化&#xff0c;全局平均池化&#xff0c;随机池化&#xff0c;空间金字塔池化。 1. 最大池化&#xff08;Max Pooling&#xff09; 最大池化是最常用的池…

将Android Library项目发布到JitPack仓库

将项目代码导入Github 1.将本地项目目录初始化为 Git 仓库。 默认情况下&#xff0c;初始分支称为 main; 如果使用 Git 2.28.0 或更高版本&#xff0c;则可以使用 -b 设置默认分支的名称。 git init -b main 如果使用 Git 2.27.1 或更低版本&#xff0c;则可以使用 git symbo…

【Django】前端技术-网页样式表CSS

文章目录 一、申明规则CSS的导入方式行内样式内部样式外部样式 二、CSS的选择器1. 基本选择器标签选择器&#xff1a; 选择一类标签 标签{}类选择器 class&#xff1a; 选择所有class属性一致的表情&#xff0c;跨标签.类名{}ID选择器&#xff1a;全局唯一 #id名{} 2.层次选择器…

Element快速学习

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;JavaWeb关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 什么是Element&#xff1f; Element&#xff1a;它是由饿了么团队开发的一个…

cpp程序设计实践,类实现树链刨分以及计算几何类

程序设计要求 是某个cq高校期末程序设计实践作业&#xff0c;全部自己做的比较小众分值90。  试建立一个继承结构&#xff0c;以栈、队列为派生类&#xff0c;建立它们的抽象基类-Bag类&#xff0c;写出各个类的声明及定义&#xff0c;并实现如下功能&#xff1a;  统一命名…

华为高品质万兆园区体验保障技术白皮书

华为高品质万兆园区体验保障技术白皮书 - 华为企业业务 re 音视频会议已经成为企业办公的核心应用系统&#xff0c;尤其是高层会议的质量对企业的运营效率有很大影响&#xff0c;相 关的体验问题也是员工投诉的重灾区。但不同于传统的网络通断类问题,体验类问题涉及的范围大、…

高通QCC3081蓝牙芯片双CVC参数配置与优化指南

高通的QCC3081芯片搭载了领先的高通1-MIC、2-MIC、3-MIC CVC回声消除和噪声抑制技术&#xff0c;无论您身处何地&#xff0c;都能通过蓝牙立体声耳机或耳塞享受清晰的语音通话体验。无论是家中的生活噪音、街道的车流声还是人群的喧哗&#xff0c;这些背景噪声都不再是通话质量…

MATLAB基础:函数与函数控制语句

今天我们继续学习Matlab中函数相关知识。 API的查询和调用 help 命令是最基本的查询方法&#xff0c;可查询所有目录、指定目录、命令、函数。 我们直接点击帮助菜单即可查询所需的API函数。 lookfor 关键字用于搜索相关的命令和函数。 如&#xff0c;我们输入lookfor inpu…

vue-plugin-hiprint 打印 预览打印+静默打印

1.安装 npm install vue-plugin-hiprint npm i socket.io-client --save //为了静默打印 &#xff08;为此还需安装客户端&#xff09; 2…html页面 引入css <link rel"stylesheet" type"text/css" media"print" href"https://cdn.jsde…

MySQL高性能读写分离实战

介绍 我的上一篇文章实现了mysql的主从复制结构&#xff0c;今天这篇继续将如何实现读写分离。 读写分离是指&#xff1a;针对数据库的写操作&#xff08;插入、更新、删除等&#xff09;访问主数据库&#xff0c;读操作访问从数据库。 因为一般网站的读请求的数量是远远大于…

photoshop学习笔记——选区3 选区的变化

选区制作完成之后可以对选区进行变化 主要有&#xff1a; 反选&#xff1a;shift ctrl I 变换 修改&#xff1a; 边界 设置选区的边界大小 类似 CSS中的borderSize平滑 对选区的角进行平滑扩展 向外扩展选区收缩 向内收缩选区羽化 让边界变得过渡透明度 设置…

大数据学习之sparkstreaming

SparkStreaming idea中初步实现 Spark core: SparkContext 核心数据结构&#xff1a;RDD Spark sql: SparkSession 核心数据结构&#xff1a;DataFrame Spark streaming: StreamingContext 核心数据结构&#xff1a;DStream(底层封装了RDD)&#xff0c;遍历出其中的RDD即可进行…

docker 安装单机版redis

把这三个放上去 修改成自己的 按照自己需求来 照图片做 vim redis.conf vim startRedis.sh mv startRedis.sh deployRedis.sh sh deployRedis.sh docker run --privilegedtrue \ --name dev.redis --restartalways \ --network dev-net \ -v ./config/redis.conf:/etc/r…

Laravel:揭秘PHP世界中最优雅的艺术品

1. 引言 在PHP的世界里&#xff0c;框架如繁星般璀璨&#xff0c;但Laravel以其独特的魅力和优雅&#xff0c;成为了众多开发者心中的艺术品。本文将深入探讨Laravel为何能在众多PHP框架中脱颖而出&#xff0c;成为最优雅的选择。 1.1 Laravel的诞生背景 Laravel的诞生可以…

Windows Server搭建局域网NTP时间服务器与客户端通实现

1.服务器环境&#xff1a; win11更改注册表 winR输入regedit win11更改注册表 winR输入regedit 2.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config&#xff0c;找到Config目录&#xff0c;双击Config目录下的AnnounceFlags&#xff0c;设为5。 3.HKEY_L…

学习大数据DAY25 Shell脚本的书写2与Shell工具的使用

目录 自定义函数 递归-自己调用自己 上机练习 12 Shell 工具 sort sed awk 上机练习 13 自定义函数 name(){ action; } function name { Action; } name 因为 shell 脚本是从上到下逐行运行&#xff0c;不会像其它语言一样先编译&#xff0c;所以函数必 须在调…