深入学习Java `synchronized` 关键字

深入学习Java synchronized 关键字

synchronized关键字通过确保在同一时间只有一个线程可以执行某个代码块,从而防止多个线程同时访问共享资源时发生数据不一致的问题。

修饰方法

synchronized用于修饰实例方法时,表示当前实例对象是同步锁。这意味着同一个实例的其他synchronized方法在同一时间只能被一个线程访问。

当多个线程访问同一个实例对象的synchronized方法时,只有一个线程可以执行该方法,其余线程必须等待。

public class SynchronizedExample {public synchronized void syncMethod() {System.out.println("Thread " + Thread.currentThread().getName() + " is executing.");try {Thread.sleep(1000); // 模拟操作耗时} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Thread " + Thread.currentThread().getName() + " finished.");}
}

修饰静态方法

synchronized用于修饰静态方法时,表示当前类对象是同步锁。这意味着同一个类的其他synchronized静态方法在同一时间只能被一个线程访问。

静态方法同步是针对类对象的同步,即使是不同实例调用,也会同步。

public class SynchronizedStaticExample {public static synchronized void syncStaticMethod() {System.out.println("Thread " + Thread.currentThread().getName() + " is executing static method.");try {Thread.sleep(1000); // 模拟操作耗时} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Thread " + Thread.currentThread().getName() + " finished static method.");}
}

修饰代码块

synchronized代码块可以指定任意对象作为同步锁。它提供了更细粒度的控制,可以仅对需要同步的代码进行同步,而不是整个方法。

代码块同步提供了更灵活的控制,可以对特定对象进行同步。

public class SynchronizedBlockExample {private final Object lock = new Object();public void syncBlock() {synchronized (lock) {System.out.println("Thread " + Thread.currentThread().getName() + " is executing block.");try {Thread.sleep(1000); // 模拟操作耗时} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Thread " + Thread.currentThread().getName() + " finished block.");}}
}

注意事项

  1. 避免过度同步:过度使用synchronized会导致线程竞争加剧,从而降低程序性能。应尽量减少同步代码的范围,仅对必要的部分进行同步。

  2. 死锁:不当的同步使用会导致死锁现象,例如两个线程互相等待对方释放锁。避免死锁的方法包括按顺序获取锁、使用超时机制等。

  3. 可见性问题:尽管synchronized可以确保代码块内的操作是原子的,但并不能解决所有的可见性问题。在某些情况下,可能需要使用volatile关键字或java.util.concurrent包中的其他同步机制来确保变量的可见性。

参考链接

  • Java Synchronized: https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html

在这里插入图片描述

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

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

相关文章

全球首个开源类Sora模型大升级,16秒720p画质电影感爆棚!代码和权重全面开源!

目录 01 视频界开源战士 02 深度解码技术 03 打破闭环,开源赋能 潞晨Open-Sora团队刚刚在720p高清文生视频质量和生成时长上实现了突破性进展! 全新升级的Open-Sora不仅支持无缝生成任意风格的高质量短片,更令人惊喜的是,团队选…

【windows|002】WEB服务和域名介绍

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专…

【算法与设计】期末总结

文章目录 第一章 概述算法与程序时间复杂性求上界 第二章 递归与分治双递归函数——Ackerman函数分治策略大整数乘法两位两位四位x四位 三位x三位两位x六位 第三章 动态规划矩阵连乘基本要素最优子结构子问题重叠 备忘录 第四章 贪心算法活动安排问题基本要素贪心选择性质最优子…

pg表空间和mysql表空间的区别

一、表空间的定义 1、在pg中表空间实际上是为表指定一个存储的目录。并且在创建数据库时可以为数据库指定默认的表空间。创建表和索引时可以指定表空间,这样表和索引就可以存储到表空间对应的目录下了。 在pg中一个库中可以有多个表空间,一个表空间可以…

6月17(信息差)

1.马斯克最新预测:未来不再需要手机 将被脑机芯片替代 当地时间6月17日,马斯克高仿号“Not Elon Musk”发帖称:“你会在你的大脑上安装一个Neuralink接口,让你通过思考来控制你的新X手机吗?”对此,马斯克本…

yolov10--C#接口

一、前言 本章主要讲解yolov10的C#接口,主要是使用微软开发的openvinocsharp工具加载yolov10模型,并做推理。 二、yolov10模型转换 这里为了演示,使用官方yolov10m模型(其他大小的模型同理)做演示,可从下方…

游戏服务器研究一:bigworld 开源代码的编译与运行

1. 前言 bigworld 已经开源了它的代码,而我对于大世界的 scale 很感兴趣,所以就尝试把代码跑起来研究。但是,整个过程比我原先预想的复杂得多。 虽然能找到一些官方的帮助文档,但这些文档要么过旧,要么过于详尽&…

【护眼知识】护眼台灯真的有用吗?带你看台灯怎么选对眼睛好

在数字化时代,我们的眼睛无疑承受着前所未有的压力。无论是长时间盯着电脑屏幕,还是沉浸在书本的海洋中,眼睛的健康都成为了我们不容忽视的问题。中国现有约500万盲人,占总人口的0.4%,是世界上盲和视力损伤严重的国家之…

浏览器加速播放视频技巧

当我们看网页中的视频时,想加速播放,但是选项最高只能2倍速时,还想再加快播放如何操作? 此时我们可以按F12打开浏览器开发者选项,然后点击控制台,在浏览器输入如下代码: document.querySelecto…

月薪没到20K,必啃的WebGIS系统技术栈,你练到哪一步了?

WebGIS(网络地理信息系统)是目前地理信息系统(GIS)开发的主流,它利用互联网技术来发布、共享和交互地理空间数据。 一个完整的WebGIS项目通常涉及以下几个主要环节:具备一定的理论知识,数据生产…

MAGs培养有线索了?宏组学中未培养微生物表型与培养条件预测

宏基因组测序技术让人们对地球上微生物的多样性有了更深入的了解,但分离培养是研究微生物的生理代谢功能并解析其生态作用的关键。2023年11月的世界微生物数据中心(WDCM)年会中,全面启动了全球“未培养微生物培养组”计划&#xf…

毕业回家寄大量衣服裤子省钱技巧分享

很多宝子们问我,怎么寄快递更加便宜划算,特别是当你有很多的衣服裤子这类型的衣物的时候,怎么寄件最便宜。 今天分享几个寄快递的省钱方法以及经验分享。 1、惠发快递 像寄包裹快递,可以找快递平台进行下单,这样会更…

【机器学习300问】124、什么是LSTM?LSTM的基本结构是怎样的?

长短期记忆网络(LSTM)是一种解决隐变量模型长期信息保存和短期输入缺失问题的方法,有趣的是,长短期记忆网络的设计比门控循环单元稍微复杂一些, 却比门控循环单元早诞生了近20年。 一、什么是LSTM? LSMT全…

M41T00串行实时时钟-国产兼容RS4C1339

RS4C1340是一种实时时钟(RTC)/日历,与ST M41T00引脚兼容,功能等效,包括软件时钟校准。该器件还提供VBAT引脚上的涓流充电能力、较低的计时电压和振荡器STOP标志。寄存器映射的块访问与ST设备相同。涓流充电器和标志需要…

vue+springboot导入Excel表格

1.创建一个excel表格,与数据库需要的表头对应 2.(前端)导入excel的按钮 <template class"importExcel"><el-button type"primary" click"chooseFile">导入<i class"el-icon-upload el-icon--right"></i><…

短路是怎么形成的

1. 短路分为电源短路和用电器短路。 电源短路&#xff1a;电流不经过任何用电器&#xff0c;直接由正极经过导线流向负极&#xff0c;由于电源内阻很小&#xff0c;导致短路电流很大&#xff0c;特别容易烧坏电源。 用电器短路&#xff1a;也叫部分电路短路&#xff0c;即一根…

利用AI云防护实现高效负载均衡

在当今高度数字化的世界里&#xff0c;保证网站和应用的高可用性和响应速度对企业的业务连续性和用户体验至关重要。传统的负载均衡技术虽然能够分发流量&#xff0c;但在面对突发流量、DDoS攻击或资源动态调整时往往力不从心。本文将探讨如何借助AI云防护服务&#xff0c;不仅…

搭贝低代码开发平台:高效、灵活、经济的软件开发解决方案

在当今快速发展的数字化时代&#xff0c;企业对于快速、灵活且成本效益高的软件开发需求日益增长。搭贝低代码开发平台以其强大的功能和用户友好的体验&#xff0c;正在成为众多企业&#xff0c;特别是中小企业&#xff0c;软件开发的首选工具。 &#x1f4c8; 什么是低代码开发…

中力股份注册获批复:“重营销轻研发”明显,屡屡因违规被罚

《港湾商业观察》施子夫 王璐 冲刺上交所主板即将满两年&#xff0c;浙江中力机械股份有限公司&#xff08;以下简称&#xff0c;中力股份&#xff09;于4月24日宣布&#xff0c;首次公开发行股票的注册申请已获证监会同意。 不出意外的话&#xff0c;预计不久的数月内中力股…

电子期刊制作秘籍:如何让你的出版物脱颖而出?

​如何让你的电子期刊在众多出版物中脱颖而出&#xff0c;吸引读者的目光呢&#xff1f;在微信公众号这个平台上&#xff0c;让你的电子期刊内容更具吸引力、专业性和创新性&#xff0c;是至关重要的。下面&#xff0c;我将教你制作电子期刊一些方法&#xff0c;助你打造出一本…