JAVA多线程基础篇 6、详解synchronized

电子技术设计——16×16点阵汉字显示设计 同时,设计还应注重提升显示品质,以保证汉字的稳定展示和观感舒适。本设计的目的是构建一个能够准确在LED点阵上展示汉字的系统,并允许用户通过输入设备来选择所需的汉字,我们将验证设计方案的实际操作性和效果,以确保其满足设计目标。在LED点阵显示和汉字信息处理技术的结合下,研究者们着手研究如何在LED点阵上有效地显示汉字,并提出了一系列显示算法和优化策略,旨在实现清晰且易于阅读的汉字显示效果。首先,你需要准备16×16的LED点阵面板,通常这些点阵是8×8点阵的两倍,因此可以由两个8×8的点阵组合而成。 阅读详情

synchronized是java语言最常用的加锁指令。

1. Synchronized的使用

在java运行环境中,每个实例都对应有自己的一把锁,不同的锁之间互不影响,相同的锁互相排斥。
通一把锁,在同一时间,只能被一个线程获取,没有获得锁的线程只能等待。

1.1 修饰实例方法

实际上是在this对象上加锁。参照1.2

public void synchronized  dosomething() {
 }

1.2 在代码块里显式给this对象加锁

 synchronized (this) {
 }

1.3 在代码块里显示给对象加锁

建议在这个指定对象上加上final修饰。因为 o 对象如果指向变化了,锁对象就会变化,会导致问题。

final Object o = new Object();
synchronized (o) {
}

1.4 修饰静态方法

实际上是在这个类的class对象上加锁。参照1.5
举例来说,这个类的名称是A,这个方法等同于在A.class这个对象上加锁。

public static synchronized void dosomething() {
} 

1.5 显式锁定class对象

在这里需要注意,在jvm里每个类加载后就会创建一个class对象,比如A类,在jvm里就有且只有一个A.class对象,因此,如果对A.class上锁,那么其他争抢A.class对象的线程都会等待与争抢

synchronized(A.class){
}

2.Synchronized的原理

在java中,锁的实现机制是通过以下三个机制协调实现的。

  • 1.锁对象
  • 2.锁对象所关联的Monitor对象。
  • 3.Monitor对象锁关联的同步队列。

其流程如下,线程在获取锁时,会根据锁对象的头信息,查找monitor对象,检查monitor对象是否被其他线程占用。

    1. 如果monitor对象没有被占用,则标记monitor对象为本线程占用。并且monitor内部的锁计数器+1。如果锁方法完成,在解锁时锁计数器-1,并且清除monitor对象的所有者信息为空。 由于锁有可重入机制,如果monitor对象的所有者是自己,那么会允许该线程重复获取锁。
    1. 如果monitor对象被占用,且所有者不是本线程。则会进入monitor关联的同步队列。在monitor对象被解锁时,同步队列上的线程会被唤醒,重新抢锁。注意wait方法也可以进入到这个同步队列。

在java程序中,synchronized方法编译为java字节码,实际上就是用
monitorenter 方法和monitorexit 方法来包裹住synchronized方法。

3.Synchronized的优化

在早期jdk版本中,synchronized使用的是重量级锁(悲观锁),效率相比较低。随着jdk升级,synchronized进行了优化,内部会对锁进行逐步升级,因此提升了适应性,效率已经大幅提升了。

3.1 Synchronized加锁膨胀过程

synchronized在加锁的时候一开始是偏向锁,当发生锁冲突的时候,会升级为轻量级锁即CAS,在重试10次后,如果仍然有线程无法获取锁将升级为重量级锁。

  • 偏向锁:在对象头记录所属线程,当新线程访问对象头时会比较对象头记录的线程id,如果不一致,将触发锁升级。
  • 自旋锁:第一次升级为自旋锁。默认10次尝试。
  • 重量级锁:自旋锁尝试多次失败后升级为重量级锁,想要获取锁的线程将进入等待队列。

注意:synchronized加锁的对象不能使用String常量、Integer、Long等基础类型。

3.2 锁消除

public String lockcancel() {
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < 10; i++) {
        sb.append("i:" + i);
    }
    return sb.toString();
}

在编译时,编译器就会判断出sb这个对象并不会被这段代码块以外的地方访问到,更不会被其他线程访问到,这时候的加锁就是完全没必要的,编译器就会把这里的加锁代码消除掉,于是,编译器会将程序中的sb对象替换为线程不安全的StringBuilder 类型,以提升效率。

3.3 锁的粗化和细化

  • 锁粗化

如果一系列的连续操作都对同一个对象反复加锁解锁,甚至加锁操作时出现在循环体中,那即使没有线程竞争,频繁地进行互斥同步操作也会导致不必要的性能损耗。

public void method(String s1, String s2){
    synchronized(this){
        System.out.println("s1");
    }
    synchronized(this){
        System.out.println("s1");
    }
}

会被优化为

public void method(String s1, String s2){
    synchronized(this){
        System.out.println("s1");
        System.out.println("s1");
    }
}
  • 锁细化
    由于加锁后程序进入临界区,为提升系统整理效率,应当减少加锁范围。尽量不要对一整个方法进行加锁,而是抽离出一个方法中的共享数据,只对方法中的这部分数据代码加锁。

总结

Synchronized的运行过程有许多值得了解的细节。

多线程系列在github上有一个开源项目,主要是本系列博客的实验代码。

https://github.com/forestnlp/concurrentlab

如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。

您的支持是对我最大的鼓励。

UG NX二次开发(C++)-UIStyler-指定平面的对象和参数获取 在采用NXOpen C++进行二次开发时,采用Menu/UIStyler是一种很常见的方式,这样可以制作精美的界面,而且常用的块对象也集成了快速编程的代码,我们可以快速的利用这些块来定制我们需要的界面。但是,对于很多初学者可能对选择对象的获取不是很熟悉,我们本文以选择“指定平面”来讲一下如何获取选择的对象和对象的参数。另外,由于我们的UG NX二次开发学习讨论群QQ一群已满,有希望参与学习的有志之士加入我们的QQ二群:683566590。 阅读详情

相关推荐

Groq LPU架构解析:确定性线性处理器如何重塑AI推理

语言模型推理正从‘通用算力堆叠’转向‘确定性硬件定制’。LPU(Language Processing Unit)作为一种面向大模型推理的领域专用处理器,摒弃传统GPU的并行调度、多级缓存与动态执行范式,转而采用空间计算、静态编译与单线程线性流水线设计,实现纳秒级延迟可控性和92%+的HBM带宽利用率。其核心价值在于将模型结构、内存访问、时序路径全部在编译期固化,从而消除运行时抖动——这正是当前MLOps工程师应对A100显存碎片、vLLM调度开销与P99延迟不稳等痛点的关键技术路径。Groq 3 LPU与

weixin_30599521的博客 327

Java多线程基础-15:Java 中 synchronized 的优化操作 -- 锁升级、锁消除、锁粗化

synchronized 的锁优化操作,如何理解锁升级、锁消除、锁粗化

wyd_333的博客 2648

AI Agent Harness Engineering 监控与日志系统搭建

在生成式AI(Generative AI)与大语言模型(LLM)普及的今天,AI Agent(自主智能代理)已经成为了继「LLM API调用」「单轮/多轮对话」之后的第三代AI应用范式——Agent能够自主感知环境、制定多步决策、调用外部工具(Web搜索、数据库、RAG检索、企业系统API等)、执行复杂任务并优化自身策略。然而,随着Agent应用从Demo原型快速落地到企业生产环境,一系列与工程化落地强绑定的可观测性(Observability)问题正在成为Agent项目成功上线、稳定运行的最大瓶颈。

AI开发架构师 184

synchronized锁的优化

synchronzied同步锁保证线程安全依赖于操作系统的互斥锁(Mutex Lock),消耗资源的同时还需一直等待,没有额外的尝试获取机制,不过在java1.6以后进行了优化。

weixin_62226624的博客 556

病理组学分析系列教程1:使用Python-histolab进行病理图像预处理,tiles切片自动生成

病理图像tiles自动生成,WSI图像预处理

qq_43449643的博客 1741

在iPad上使用Python进行编程

如果你拥有一台iPad,并且想在上面编写和运行Python代码,你会发现iPad提供了一些适用的工具和应用程序来满足你的需求。安装一个Python解释器应用程序,编写和运行Python代码,使用第三方库和模块,以及存储和共享代码,这些步骤将帮助你在iPad上进行Python编程。要在iPad上运行Python代码,首先需要安装一个Python解释器。这些应用程序提供了一个交互式的开发环境,允许你编写、编辑和运行Python代码。一旦你安装了Python解释器应用程序,你可以开始编写Python代码了。

2301_79366435的博客 4627

Synchronized锁原理和优化

synchronized中文意思是同步,也称之为”同步锁“。synchronized的作用是保证在同一时刻, 被修饰的代码块或方法只会有一个线程执行,以达到保证并发安全的效果。synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。在JDK1.5之前synchronized是一个重量级锁,相对于j.u.c.Lock,它会显得那么笨重,随着Javs SE 1.6对synchronized进行的各种优化后,synchronized并不会显得那么重了。

chuyouyinghe的专栏 487

大语言模型应用指南:幻觉和偏见问题

大语言模型应用指南:幻觉和偏见问题 1. 背景介绍 1.1 大语言模型的发展历程 1.1.1 早期的语言模型 1.1.2 Tr

AI天才研究院 958

Synchronized 优化

Java synchronized 是一种机制,可以保证多个线程在访问共享资源时的同步性。synchronized 关键字可以用于方法或代码块上,当一个线程获取了这个对象的锁后,其他线程如果也要获取这个锁的话就必须等待该线程释放锁。这样可以保证共享资源的访问顺序和正确性,避免数据竞争和死锁等问题。

AliceNo的博客 1870

基于YOLOv5的空间目标智能监测系统:航天器与太空碎片识别技术实现

做完这个项目,你会发现自己完整走过了“数据采集→标注→模型训练→功能集成→界面开发”的毕设全流程,这不仅是技术能力的证明,更是对“技术守护宇宙安全”这一理念的实践。答辩时,你可以重点讲这几点:系统解决了航天监测的哪些痛点、YOLOv5在太空目标检测中的性能优势、系统未来能怎么优化(比如对接航天监测网络、实现实时轨道预测)。未来,这个系统还能往“更智能”的方向发展:比如结合轨道计算预测碰撞风险、开发移动端APP让天文爱好者参与太空垃圾上报、在航天任务中实现全自动避障决策……想象空间很大。

m0_64661770的博客 111

PCL体素滤波器【2026最新版】

PCL实现的VoxelGrid类和ApproximateVoxelGrid体素滤波,详细记录。博客长期更新,本文最近一次更新时间为:2026年3月14日。

点云侠的博客 39万+

synchronized原理和优化过程

如果某一个资源被多个线程共享,为了避免因为线程的抢占资源而出现线程不安全的因素,我们需要对线程进行同步,synchronized就是为了保证不会因为线程的抢占式执行而出现的bug。是并发编程中的一个重要的特性。那么接下来就看明白synchronized的底层原理。synchronized在Java并发编程中是非常重要的一个知识点。希望通过上述的描述,对synchronized有个整体的认识。如有不妥,还请多多包涵。

qq_63525426的博客 1145

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【面试篇】Java多线程并发之Java的synchronized关键字详解

10.synchronized关键字 synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。 Java线程是映射到操作系统的原生线程之上的。如果要挂起或者唤醒一个线程,都需要操作系统帮忙完成,而操作系统实现线程之间的切换时需要从用户态转换到内核态,这个状态之间的转环需要相对比较长的时间,时间成本相对较高。 但在Java1.6之后Java官方从JVM层面对synchronized较大优化,所以现在的s

Mind_programmonkey的博客 898

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java多线程升级篇(一)——synchronized详解

Java多线程升级篇(一)——synchronized详解 上一周写了两篇关于Java多线程的内容,因为接近七月的最后几天,距离原定的计划还有一段距离,所以要抓紧时间再完成三篇关于java多线程的内容,这个月的总结内容就完成了。Java多线程的内容太多太多,有一些我现在还没有完全的搞明白,自然不敢写博客来误导大家,只是尽自己所能,先学会多少,写多少,也希望大家多多指点。 这一篇是关于Synchro...

weixin_43666945的博客 268

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

JAVA多线程基础篇-关键字synchronized

syncronized是JAVA多线程开发中一个重要的知识点,涉及到多线程开发,多多少少都使用过。那么syncronized底层是如何实现的?为什么加了它就能实现资源串行访问?本文将基于上述问题,探索syncronized的用法及原理。由于本节知识涉及到JMM相关知识,具体可查看上一篇文章JAVA多线程基础篇-关键字volatile。由上表可知,synchronized的具体功能包括:锁方法、锁对象和锁代码块。1.概念 一个线程可以多次执行synchronized,重复获取同一把锁。 2.案例 运行结果如下

qq_33479841的博客 752

多线程并发及synchronized案例演示-java基础篇

我是一个从汽车行业转行IT的项目经理,我是Edward。今天跟大家聊聊多线程并发以及synchronized案例演示 sleep static void sleep(long ms) 使运行该方法的线程阻塞指定毫秒,超时后线程会自动回到RUNNABLE状态等待再次获取 时间片并发运行。 用黄宏著名小品《装修》演示一下,sleep及其interrupt的效果。 /** * 小品《装修》 * @...

Forever Young 369

Java多线程学习篇(二)synchronized

synchronized 有二种修饰方法: 修饰一个方法 synchronized public void runTest{ /**/ } 修饰一个代码块 public void runTest{ synchronized( /*某一对象或某一类*/ ){ /* 代码块 */ } } s...

191

Java多线程篇(1)——深入分析synchronized

Java多线程篇(1)——深入分析synchronized

笔记罢了 1383

JAVA多线程-基础篇-synchronized

一、为什么需要synchronized? 因为在并发的场景下,是需要保证线程安全的,产生线程安全问题的原因主要有两个:一是临界资源,二是多线程访问临界资源,为了解决这两个问题,需要保证同一时刻只能有一个线程访问临界资源,synchronized就是为这个而生的,同时它还能保证内存可见性。 二、作用 synchronized我们通常翻译为“同步”,一句话概括其作用:防止资源冲突。具体来说:当任务执行...

weixin_34273046的博客 87

【Java_多线程并发编程】基础篇——synchronized关键字

1. synchronized同步锁的原理 当我们调用某对象的synchronized方法或代码块时,就获取了该对象的同步锁。例如,synchronized(obj)就获取了“obj这个对象”的同步锁。不同线程对同步锁的访问是互斥的。也就是说某一时刻,对象的同步锁只能被一个线程获取到。通过同步锁,我们就能在多线程中,实现对“对象/方法”的互斥访问。 例如,现在有两个线程A和线程B,它们都会访问“...

weixin_30954607的博客 87

Java的多线程之同步篇二:synchronized关键字

一、synchronized关键字        Lock和Condition接口为程序设计人员提供了高度的锁定控制。然而,大多数情况下,并不需要那样的控制,并且可以使用一种嵌入到Java语言内部的机制。从1.0版开始,Java中的每一个对象都有一个内部锁。如果一个方法用synchronized关键字声明,那么对象的锁将保护整个方法。也就是说,要调用该方法,线程必须获得内部的对象锁。 换句

◇″淡定。 584

Java多线程篇--并发关键字synchronized和volatile

在之前的文章中,已经发布了常见的面试题,这里我花了点时间整理了一下对应的解答,由于个人能力有限,不一定完全到位,如果有解答的不合理的地方还请指点,在此谢过。 本文主要描述的是java多线程中面试的锁机制。这个是面试中的重点内容,也是平时开发过程中经常碰到的问题,所以我们一定要重点了解锁的内容。锁的内容主要有关键字volatile,synchronized,这两个要掌握其实现的原理,下面的内容会重点描述这两个关键字的实现原理以及面试中可能出现的问题。如果对这些感兴趣的话,可以看下公众号中源码的内容。 .

rqc112233的专栏 206

Java多线程系列--“基础篇”04之 synchronized关键字

目录 概要 1. synchronized原理 2. synchronized基本规则 3. synchronized方法 和 synchronized代码块 4. 实例锁 和 全局锁 概要 本章,会对synchronized关键字进行介绍。涉及到的内容包括:   1. synchronized原理 在java中,每一个对象有且仅有一个同步锁。这也意味着,同步锁是依赖于对象而存在...

ycb1689的专栏 271

java 底层优化_Java多线程系列 基础篇07 synchronized底层优化

转载一、重量级锁上篇文章中向大家介绍了Synchronized的用法及其实现的原理。现在我们应该知道,Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchroniz...

weixin_42181545的博客 92

Java多线程系列 基础篇05 synchronized关键字

1. synchronized原理 在java中,每一个对象有且仅有一个同步锁,所以同步锁是依赖于对象而存在。当我们调用某对象的synchronized方法时,就获取了该对象的同步锁。例如,synchronized(obj)就获取了“obj这个对象”的同步锁。不同线程对同步锁的访问是互斥的。也就是说,某时间点,对象的同步锁只能被一个线程获取到!通过同步锁,我们就能在多线程中,实现对“对象/方法”的...

weixin_34321977的博客 79
上一篇: JAVA多线程基础篇 5、原子性与锁
下一篇: JAVA多线程进阶篇 1、JUC原子类之Atomic
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值