Java线程安全之同步方法

news2024/11/25 2:29:30

同步方法

使用synchronized修饰的方法,就叫做同步方法,其固定格式如下:

public [static] synchronized 返回值类型 同步方法() {
	可能会产生线程安全问题的代码 
}

注意事项:

  • 同步方法可以是普通成员方法,也可以是static静态方法
  • 普通成员同步方法,默认锁对象为this,即当前方法的调用对象
  • static静态同步方法,默认锁对象是当前类的字节码对象(一个类有且只有一个)

类的字节码对象:类名.class,固定用法(当前记着即可,后续反射章节会学习)

案例1:普通同步方法

​ 创建子线程1,调用100次普通方法print1(逐字输出 “好好学习”)

​ 创建子线程2,调用100次普通方法print2(逐字输出 “天天向上”)

​ 要求,两个子线程在执行方法的过程中,不会被另一个线程打断。

class Printer {
	//普通同步方法: 锁对象默认为this
	public synchronized void print1() {
		System.out.print("天");
		System.out.print("天");
		System.out.print("向");
		System.out.print("上");
		System.out.println();
	}
	
	public void print2() {	
        //同步代码块,也使用this作为锁对象
        //测试时,可以注释同步代码块,或使用其他锁对象,然后观察程序运行效果
		//synchronized (Printer.class) {
        synchronized (this) {
			System.out.print("努");
			System.out.print("力");
			System.out.print("学");
			System.out.print("习");
			System.out.println();
		}
	}
}

public class Test16_Funtion {
	public static void main(String[] args) {
		//准备一个对象
		final Printer p = new Printer();
		
		//创建子线程1,输出100次 "好好学习"
		Thread th1 = new Thread() {
			@Override
			public void run() {
				for(int i = 0; i < 100; i++) 
					p.print1();
			}
		};
		
		//创建子线程2,输出100次 "天天向上"
		Thread th2 = new Thread() {
			@Override
			public void run() {
				for(int i = 0; i < 100; i++) 
					p.print2();
			}
		};
		
		th1.start();
		th2.start();
	}
}

测试效果:

  • print2方法不使用同步代码块,或不使用this作为锁对象,会出现输出混乱的情况,线程没有实现同步(上锁失败)

在这里插入图片描述

  • print2方法使用同步代码块,且用this作为锁对象,成功实现线程同步

在这里插入图片描述

案例2:静态同步方法

​ 将上述案例中的普通同步方法,修改为静态同步方法,实现原有功能。

class Printer {
    // ...省略print1() print2()
    
	//static静态同步方法: 锁对象默认为当前类字节码对象
	public static synchronized void print3() {
		System.out.print("天");
		System.out.print("天");
		System.out.print("向");
		System.out.print("上");
		System.out.println();
	}
	
	public void print4() {	
        //同步代码块,使用当前类字节码对象作为锁对象
        
        //注释掉同步代码块,运行测试,观察效果
        //不使用当前类字节码对象作为锁对象,运行测试,观察效果
        //synchronized (this) {
		synchronized (Printer.class) {
			System.out.print("努");
			System.out.print("力");
			System.out.print("学");
			System.out.print("习");
			System.out.println();
		}
	}
}

public class Test16_Funtion {
	public static void main(String[] args) {
		//准备一个对象
		final Printer p = new Printer();
		
		//创建子线程1,输出100次 "好好学习"
		Thread th1 = new Thread() {
			@Override
			public void run() {
				for(int i = 0; i < 100; i++) 
					Printer.print3();
			}
		};
		
		//创建子线程2,输出100次 "天天向上"
		Thread th2 = new Thread() {
			@Override
			public void run() {
				for(int i = 0; i < 100; i++) 
					p.print4();
			}
		};
		
		th1.start();
		th2.start();
	}
}

运行测试:

​ 按照print4方法中描述进行测试,验证结论:

static静态同步方法: 锁对象默认为当前类字节码对象(类名.class)

线程状态图为:

在这里插入图片描述

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

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

相关文章

聊一聊 webpack5性能优化有哪些?

介绍 此文章基于webpack5来阐述 webpack性能优化较多&#xff0c;可以对其进行分类 优化打包速度&#xff0c;开发或者构建时优化打包速度&#xff08;比如exclude、catch等&#xff09;优化打包后的结果&#xff0c;上线时的优化&#xff08;比如分包处理、减小包体积、CDN…

什么是安全生产痕迹化管理?如何做到生产过程中全程痕迹化管理?

安全生产痕迹化管理&#xff0c;简单来说&#xff0c;就是通过记录一些“信息”来确保安全工作的进展。这些方法包括记会议内容、写安全日记、拍照片、签字盖章、指纹识别、面部识别还有手机定位等。记录下来的文字、图片、数据和视频&#xff0c;就像一个个“脚印”&#xff0…

“免费”制作中国式报表的工具横空出世,内置丰富图表组件!

一.报表制作的烦恼 报表是我们日常工作中的好伙伴&#xff0c;它在企业管理和决策过程中扮演着重要角色&#xff0c;能够清晰直观地展示数据&#xff0c;让关键信息一目了然。 然而&#xff0c;无论是使用传统的手工报表还是基于软件的普通报表操作&#xff0c;都存在不便之处…

clickhouse sql 语法参考

clickhouse sql 语法参考 1. select1.1 将结果中的某些列与 re2 正则表达式匹配&#xff0c;可以使用 COLUMNS 表1.2 ARRAY JOIN - 数组数据平铺1.3 LEFT ARRAY JOIN 2. create2.1 分布式创建数据库2.2 分布式创建复制表2.4 CREATE TABLE [IF NOT EXISTS] [db.]table_name ENGI…

layui table 重新设置表格的高度

在layui的table模块中&#xff0c;如果使用table.render({})渲染了一个表格实例时&#xff0c;确定了height配置&#xff0c;后续用table.resize(id)方法重置表格尺寸时&#xff0c;表格的高度是不会变化的&#xff08;如果我的理解没有错的话&#xff09;。 有时我们希望根据…

ChatGPT在办公与科研中有怎样的应用?又是如何做论文撰写、数据分析、机器学习、深度学习及AI绘图

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT-3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年11月7日&#xff0c;OpenAI首届开发者大会被称为“科技界的春晚”&#xff0c;吸引了全球广大…

8.1 字符串中等 43 Multiply Strings 38 Count and Say

43 Multiply Strings【默写】 那个难点我就没想先解决&#xff0c;原本想法是先想其他思路&#xff0c;但也没想出。本来只想chat一下使用longlong数据类型直接stoi()得不得行&#xff0c;然后就看到了答案&#xff0c;直接一个默写的大动作。但这道题确实考察的是还原乘法&…

C++(入门2)

承接上C&#xff08;入门1&#xff09;&#xff1a;CSDN 引用&#xff1a;&#xff08;类似指针但不同于指针&#xff0c;后续会将两则不同&#xff09; 概念 引⽤不是新定义⼀个变量&#xff0c;⽽是给已存在变量取了⼀个别名&#xff0c;编译器不会为引⽤变量开辟内存空间…

c语言第六天笔记

分支结构 分支结构&#xff1a;又被称之为选择结构 概念 选择结构&#xff1a;根据条件成立与否&#xff0c;选择相应的操作。 条件构建 关系表达式&#xff1a;含有关系运算符的表达式&#xff08;>,,&#xff09; 逻辑表达式&#xff1a;含有逻辑运算符的表达式&…

网络安全相关工作必须要有证书吗?

在当今数字化时代&#xff0c;网络安全已成为至关重要的领域。然而&#xff0c;对于从事网络安全相关工作的人员来说&#xff0c;证书是否是必不可少的呢? 一、网络安全证书的重要性 网络安全证书在一定程度上能够证明从业者具备相关的知识和技能。例如&#xff0c;CISP 作为国…

基于LLM开发AI应用竟如此简单

一、什么是LLM 随着人工智能技术的不断发展&#xff0c;越来越多的企业和机构开始将其应用于各个领域。其中&#xff0c;基于语言模型的人工智能技术&#xff08;LLM&#xff09;在自然语言处理、文本生成等方面表现出色&#xff0c;被广泛应用于各种场景中。 LLM是一种基于大…

你们要的“轮子”来了!67 个仓颉语言三方库正式公开!

01 Cangjie-TPC社区简介 Cangjie-TPC&#xff08;Third Party Components&#xff09;用于汇集基于仓颉编程语言开发的开源三方库&#xff0c;帮助开发者方便、快捷、高质量构建仓颉程序。 Cangjie-TPC社区联合软通动力、宝兰德、普元、上汽以及社区开发者共同完成第一批常用…

快速设置 terminator 透明背景

看图&#xff0c;按步骤设置后⭐重启一个终端则为透明效果 效果展示&#xff1a;

vscode+platformio开发小技巧

使用vscodeplatformio开发&#xff0c;具体安装配置文章很多&#xff0c;这里分享一些方便使用的小技巧&#xff0c;让使用体验在不增加学习成本的情况下更加丝滑。 1、配置依赖库 在使用vscode开发前&#xff0c;arduino环境遗留了一些库文件&#xff0c;这些第三方库可以通…

(20240801)矿山固废基胶凝材料及混凝土中文期刊整理

一、篇名:固废 级别:EI + 篇名:固废混凝土/水泥/胶砂/胶凝材料 级别:EI

Flat Ads资讯:Meta、Google、TikTok 7月产品政策速递

Flat Ads拥有全球媒介采买(MediaBuy)业务,为方便广告主及时了解大媒体最新政策,Flat Ads将整理大媒体产品更新月报,欢迎大家关注我们及时了解最新行业动向。 一、Meta 1、Reels 应用推广现可突出显示应用评分、点评和下载量 为了不断优化 Instagram 上的广告体验和广告表现,…

攻防世界之《这个按钮做什么》题解

下载解压后&#xff0c;发现只有一个文件。 放入exeinfope软件里看看 根据activity猜测可能是安卓软件&#xff0c;修改文件后缀为.apk 然后用模拟器打开这个软件并会自动安装。 打开软件界面如下&#xff1a; 看得出来只有一个密码输入框&#xff0c;应该找到对应的密码就会…

【游戏引擎之路】登神长阶(八)——Python之旅行,休息一下,去看看新世界

5月20日-6月4日&#xff1a;攻克2D物理引擎。 6月4日-6月13日&#xff1a;攻克《3D数学基础》。 6月13日-6月20日&#xff1a;攻克《3D图形教程》。 6月21日-6月22日&#xff1a;攻克《Raycasting游戏教程》。 6月23日-7月1日&#xff1a;攻克《Windows游戏编程大师技巧》。 7月…

数据结构(其二)--线性表(其二)

目录 5.栈 5.1 栈的基本操作 5.2 各种栈 &#xff08;1&#xff09;.顺序栈 i.普通顺序栈 ii.共享栈 iii.关于销毁 &#xff08;2&#xff09;.链栈 6.队列 6.1 队列的基本操作 6.2 各种队列 &#xff08;1&#xff09;.循环队列 i.代码 ii.另外一种写法 &#xff08;…

滴滴官宣潘展乐为滴滴网约车“快”乐大使

近日&#xff0c;滴滴宣布邀请游泳运动员潘展乐成为滴滴出行网约车“快”乐大使&#xff0c;同时开展打车确定性体验攻坚计划&#xff0c;上线3分钟无车赔活动&#xff0c;为司机发放高温补贴、流水加速卡等多重奖励&#xff0c;共同为用户提供更快、更便捷的出行体验。 作为男…