java Synchronized关键字和死锁

Synchronized关键字的四种使用场景 Synchronized关键字的四种使用场景: ①、修饰一个方法 ②、修饰代码块 ③、修饰静态方法 ④、修饰一个类 1.修饰一个方法 synchronized 修饰一个方法很简单,就是在方法的前面加synchronized,例如: public synchronized void method() { // todo } 在定义接口方法时不能使用synchroniz... 阅读详情

Synchronized关键字

使用简单的代码实现线程的‘死锁’,这道题考的是Synchronized关键字

Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

  1. 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
  2. 然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块
  3. 尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
  4. 当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。

package multithread_learning;
/** 
* @author xiaohao 	
* @date 创建时间:Aug 7, 2017 3:11:26 PM 
* @version 1.0   
*/
public class TestSynchronized {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Sy sy = new Sy(0);
	        Sy sy2 = new Sy(1);
	        sy.setName("t1");
	        sy2.setName("t2");
	        sy.start();
	        sy2.start();
	}
}
class Sy extends Thread {
    private int flag ;

    static Object x1 = new Object();
    static Object x2 = new Object();

    public Sy(int flag) {
        this.flag = flag;
    }
    @Override
    public void run() {
        System.out.println(flag);
        try {
            if (flag == 0) {
                synchronized (x1) {
                    System.out.println(flag+"锁住了x1");
                    Thread.sleep(1000);
//                    x1.wait(1000);
                    synchronized (x2) {
                        System.out.println(flag+"锁住了x2");
                    }
                    System.out.println(flag+"释放了x1和x2");
                }
            }
            if(flag == 1) {
                synchronized (x2) {
                    System.out.println(flag+"锁住了x2");
                    Thread.sleep(100);
//                    x2.wait(100);
                    synchronized (x1) {
                        System.out.println(flag+"锁住了x1");
                    }
                    System.out.println(flag+"释放了x1和x2");
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
此程序运行之后,由于x1在等待x2,x2在等待x1,就会进入僵持状态,产生死锁。


而此时,稍作修改,我不用Thread类的sleep方法,改用了Object 类的wait方法,此时就不会产生死锁,这也验证了wait和sleep的区别:

wait方法会释放当前对象的锁,而sleep方法不会释放当前对象锁;

package multithread_learning;
/** 
* @author xiaohao 	
* @date 创建时间:Aug 7, 2017 3:11:26 PM 
* @version 1.0   
*/
public class TestSynchronized {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Sy sy = new Sy(0);
	        Sy sy2 = new Sy(1);
	        sy.setName("t1");
	        sy2.setName("t2");
	        sy.start();
	        sy2.start();
	}
}
class Sy extends Thread {
    private int flag ;

    static Object x1 = new Object();
    static Object x2 = new Object();

    public Sy(int flag) {
        this.flag = flag;
    }
    @Override
    public void run() {
        System.out.println(flag);
        try {
            if (flag == 0) {
                synchronized (x1) {
                    System.out.println(flag+"锁住了x1");
//                    Thread.sleep(1000);
                    x1.wait(1000);
                    synchronized (x2) {
                        System.out.println(flag+"锁住了x2");
                    }
                    System.out.println(flag+"释放了x1和x2");
                }
            }
            if(flag == 1) {
                synchronized (x2) {
                    System.out.println(flag+"锁住了x2");
//                    Thread.sleep(100);
                    x2.wait(100);
                    synchronized (x1) {
                        System.out.println(flag+"锁住了x1");
                    }
                    System.out.println(flag+"释放了x1和x2");
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

0
1
1锁住了x2
0锁住了x1
1锁住了x1
1释放了x1和x2
0锁住了x2
0释放了x1和x2

由于线程t1和t2不一定哪个线程先执行,所以可能有时候第3,4行位置会互换,但下面几行结果不会变,即当flag=0时,x1对象wait的时间是1000ms,此时已经释放了x1的对象锁,等待结束之后(也就是1000ms内),flag=1的条件已经执行完了x2和x1对象,此时flag=0继续执行x1对象,也就是总是先1释放,再0释放。


但是要注意wait()和notify()方法只能放在同步代码块当中,如果不在同步代码块中使用,尽管在编译时不会出错,运行时会抛出java.lang.IllegalMonitorStateException异常。



LVGL配置文件lv_conf.h详解 lv_conf.h是一个用户级别的文件,它不属于内核的部分,因此,在不同的工程中,该文件有可能存在差异。lv_conf.h文件具有两大功能:(1)配置功能:内存、屏幕刷新周期、输入设备的读取周期,等等;(2)裁剪功能:使能失能某些功能,有效地优化Flash的分配。 阅读详情

相关推荐

2024 年 9 月青少年软编等考 C 语言三级真题解析

2024 年 9 月青少年软编等考 C 语言三级真题解析。

学习过程的记录与分享。 1708

详解Javasynchronized关键字死锁内存占用问题

Javasynchronized关键字用来进行线程同步操作,然而这在使用中经常会遇到一些问题,这里我们就来详解Javasynchronized关键字死锁内存占用问题:

重磅推荐-Qcon 2026全球软件开发大会北京站(脱敏)PPT合集(72份).zip

重磅推荐,Qcon 2026全球软件开发大会北京站(脱敏)PPT合集,共72份。A-in-SRE Loop当AI 成为核心业务后,SRE的下一站.pdfAgent 的多阶段演进与工程化落地.pdfAgent 记忆系统在 eBay 支付风控团队的探索与实践.pdfAI Agent 的记忆中间件:火山 Mem0 架构拆解及落地实践.pdfAI 大模型重塑垂域任务:淘宝闪购搜推商品理解的全新建模.pdfAI 搜索场景下的生成式 UI 工程实践.pdfAIOps Agent在运维RCA场景下的研发范式与数据飞轮实践.pdfDeepResearch X OpenClaw:实现路径与 Token 成本控制.pdfEmbedding:多模态向量与排序模型的发展与应用.pdfEvomap如何让Agent从单体智能到群体进化.pdfFrom Computer Use to Datacenter Use for AI.pdfOmni 的全模态推理架构演进.pdfOmni:全模态统一大模型的关键技术与实践.pdfOpenSandbox:重新思考 Agent 时代的 Runtime.pdfRec:面向生成式推荐的高性能推理.pdfSpec:TocoAI 的后端 Harness Engineering 实践.pdfThe Age of Autonomous Systems 自主系统的时代.pdfZillizTown:基于 Milvus 与 Claude Code 打造企业版 OpenClaw.pdf京东零售 AIGC 百亿素材供给实践.pdf从 AIOps 到 Agent Ops:故障定位 Agent 的设计与实践.pdf从 Copilot 到 DataAgent:企业级智能数据开发治理平台的技术演进实践.pdf从 Copilot 到 Director:多模态智能体如何接管 AIGC 流程.pdf从“不可验证”到“可迭代”:分析型 AI 的多智能体工程实践.pdf从“工具”到“同事”——AI 时代的产品进化.pdf从WIMP到RMCP:智能交互范式的演变与思考.pdf从一次会话到亿级并发:构建可扩展、可隔离的 AI Agent 运行环境.pdf从个人经验到组织资产:小米运维知识沉淀的闭环实践.pdf从单点辅助到 Agent 闭环.pdf从拉群救火到AI排查:端到端智能诊断体系的工程实践.pdf从推理到执行:构建 AI Agent 全链路无侵入可观测体系.pdf从烟囱到积木:基于 openYuanrong 的 AI Infra 实践.pdf企业 AI 应用全景:从试点热潮到规模落地的真实分水岭.pdf具身智能 Agent:从 VLA_VA 模型到物理世界交互的落地实践.pdf可复制的 AI Coding 全栈实战:比 OpenSpec 更轻量、更丝滑.pdf基于“假设-验证”闭环的RCAAgent实践.pdf基于业务流程管理的客户端AI Agent智能化测试实践.pdf复杂业务场景下 RCA Agent 的探索实践.pdf多模态+Agent 在培训与教育领域的应用.pdf大前端性能优化新范式:AI 火焰图在亿级 App 中的落地.pdf大规模 Agent 的评估工程实践.pdf存量修复 + 增量拦截:B 站代码债务治理实践.pdf小红书 GUI Agent 在智能化测试中的工程落地实践.pdf尽在上下文——JoyCode 的企业级 AI Coding 实践.pdf当 K8s 遇见 Ray:大模型时代 AI Workload 调度的通用范式.pdf当玩家成为“神”,他希望与怎样的 AI 共处?.pdf打破“人月神话”,Agent重塑风控产运研职能.pdf把 UI 生成接进流水线:基于半监督评测体系的 UI 自动化生产实践.pdf数据闭环的差异化重构:从百 PB 自动驾驶经验到具身智能 AI 原生基建实践.pdf智能体安全:基于AI Native的防御架构实践.pdf智能体架构的降龙十八掌:从原型到工程落地的“生死取舍”.pdf智能革命时代:自主智能体兴起与安全范式重塑.pdf有道龙虾LobsterAI的养成与实践.pdf杀死“流水线”: ColaOS(ListenHub)如何构建 AI 时代的液态超级团队.pdf构建 AI 的“第二大脑”:大规模多模态记忆平台技术实践.pdf构建 Coding Agent 的飞轮:Feedback Loop、Benchmark、Agent Engineers.pdf淘宝闪购AI 驱动 UI 自动化提效实践.pdf淘宝闪购:从骑手智能助手业务落地到 Agent 平台化建设.pdf理解与生成一体化:统一多模态大模型的自回归路线.pdf生成式 UI :AI 交互新模式探索.pdf给 Agent 做“CT”:大规模 Agent 的可观测与质量保障体系.pdf自回归模型在视觉生成领域中的应用.pdf蔚来销售大模型的工程应用与优化实践.pdf蚂蚁阿福:从 0 到生产的医疗 Agent 工程化落地.pdf让 AI 运行在工程资产上:从 PRD 到上线的交付闭环、Hybrid 执行、 Doc 与 Code 联动.pdf让开关自我消亡:AI 赋能的 Feature Flag 全生命周期治理.pdf让推理引擎可被“看见”:大模型推理端到端 Token 级可观测工程实践.pdf让每个员工都有一个 Coding Agent:蚂蚁 Vibe Coding 平台落地半年后的实践经验 .pdf超级团队进行时:从用 AI 到 AI 自己找活干.pdf面向 AI 原生负载的统一弹性调度体系:Aether 架构实践.pdf面向IoT 主动智能的用户历史压缩建模与生成式推荐实践.pdf面向内容风控垂直领域的大小模型研发实践.pdf面向工业场景的机器人操作(Robotic Manipulation)方案设计及落地实践.pdf

JavaEE】多线程之线程安全(synchronized篇),死锁问题

多线程的线程安全问题,以及死锁问题的详细讲解~~

weixin_69417428的博客 2462

线程用synchronized产生死锁的问题及解决

线程用synchronized产生死锁的问题及解决

wycyiyang的博客 1582

synchronized关键字锁机制 -- 锁的特点、锁的使用、锁竞争死锁死锁的解决方法

介绍了 synchronized 关键字 锁机制,其中重点介绍了锁的特点、使用方法死锁的相关内容。

想听风雨的博客 1858

synchronized(锁)的使用死锁问题

HarryQUQ的博客 1991

java 死锁 内存消耗_详解Javasynchronized关键字死锁内存占用问题

先看一段synchronized 的详解:synchronizedjava语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。二、然而,当一个...

weixin_39792519的博客 304

[Java高并发系列(1)]Javasynchronized关键字详解+死锁实例

[Java高并发系列]Javasynchronized 关键字详解 + 死锁实例 1 概述 synchronized用于给某个对象加锁 , 其修饰的对象可以是代码块方法(分为实例方法静态方法). 不是说synchronized是对代码块或方法上锁, 它锁的是对象(当然也可能是类, 不过类也算对象吧hhh — 某个Object , 或者this, 或者 xxx.class) 下面来...

lawfree的博客 2922

Java 对象锁类锁 死锁(多线程synchronized关键字

本文主要是将synchronized关键字用法作为例子来去解释Java中的对象锁 类锁。一、synchronized关键字synchronized关键字有如下两种用法:1、 在需要同步的方法的方法签名中加入synchronized关键字synchronized public void getValue() { System.out.println("getValue method th

hugh 的博客 4494

java 死锁 内存消耗_先看一段synchronized 的详解:synchronizedjava语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多...

先看一段synchronized 的详解:synchronizedjava语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。二、然而,当一个...

weixin_33321740的博客 128

【多线程】synchronized关键字死锁

讲解了synchronized关键字死锁的成因,死锁的解决方法

fayifenjihuang的博客 1147

java 内存锁_详解Javasynchronized关键字死锁内存占用问题

先看一段synchronized 的详解:synchronizedjava语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。二、然而,当一个...

weixin_39883091的博客 523

Java并发编程(二)-----synchronized关键字死锁

synchronized 话不多说先上图 1.为什么要使用synchronized 在并发编程中存在线程安全问题,主要原因有:1.存在共享数据 2.多线程共同操作共享数据。关键字synchronized可以保证在同一时刻,只有一个线程可以执行某个方法或某个代码块,同时synchronized可以保证一个线程的变化可见(可见性),即可以代替volatile。 2.实现原理 synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性 3.

niu_8865的博客 249

Java中多线程同步问题,锁 ,死锁, synchronized 关键字的用法

•对象的锁标志 –每个对象都有一个锁标志 –使用synchronized可与锁标志交互 •synchronized关键字的用法有两种: –synchronized语句 –synchronized方法 •synchronized语句:   synchronized (obj){   //在synchronized语句块中   //对obj的成员只能进行同步访问} /*• 一旦一个包含...

凡磊的技术栈 627

Java并发编程必备:Synchronized关键字深入解析

Java多线程编程中,线程安全是非常重要的一个概念。为了防止多个线程同时访问共享资源时出现数据不一致或其他竞态条件问题,Java提供了关键字监视器锁(Monitor Lock)机制。这个博客将深入探讨的原理、使用场景以及与监视器锁的关系。通过本文,我们深入探索了Java中的关键字,包括其互斥性可重入性的特性。文章详细介绍了的三种使用方式:修饰代码块、修饰普通方法修饰静态方法。同时,我们还解析了监视器锁(Monitor Lock)的底层实现,以及与的对比。

2302_81090306的博客 1175

利用synchronized关键字了解死锁

利用synchronized关键字了解死锁 博主个人网站:https://blog.zhenglin.work synchronizedjava关键字从字面上理解是同步的意思,它的作用是限制多线程的,使多线程暂时变成一个线程,确保线程的安全;synchronized代码块(包括方法、某个对象)只能一个线程调用;待这个线程调用完成后,其他线程才能调用此代码块; 就像生活中 ,第一个线程执行遇到s...

zhenglin的博客 332

java线程同步代码块_java线程的同步代码块关键字synchronized

Java 慎用方法级别的synchronized关键字为什么要这么说呢, 因为笔者被这个坑过(其实是自己坑自己)╮(╯_╰)╭先看一段synchronized的详解:synchronizedjava语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。一、当两个并发线程访问同一个对象object中的这个synchronized(this)同...

weixin_39661881的博客 285

synchronized关键字浅析

背景 在实际工程实践中,多线程并发执行场景十分常见。所谓线程安全性即是多线程并发执行场景中需要保证的基本要求,如果不能保证线程安全性,那么势必会在实际工程实践中产生错误数据、甚至严重且不易察觉的异常处理,导致最终结果的不确定性。对于临界资源,或者是必须串行操作的流程,势必需要保证多个线程中每次仅有一个线程持有或仅有一个线程进入。如何保证多个线程由并行转串行,去持有临界资源或进入必须串行操作的流程...

吾日三省吾身 1321

【多线程-初阶】 synchronized 关键字 - 监视器锁 monitor lock

在可重⼊锁的内部, 包含了 “线程持有者” “计数器” 两个信息:(1)如果某个线程加锁的时候, 发现锁已经被⼈占⽤, 但是恰好占⽤的正是⾃⼰, 那么仍然可以继续获取到锁, 并让计数器⾃增.(2)解锁的时候计数器递减为 0 的时候, 才真正释放锁. (才能被别的线程获取到)针对每⼀把锁, 操作系统内部都维护了⼀个等待队列. 当这个锁被某个线程占有的时候, 其他线程尝试进⾏加锁, 就加不上了, 就会阻塞等待, ⼀直等到之前的线程解锁之后, 由操作系统唤醒⼀个新的线程,再来获取到这个锁.

2402_85428625的博客 2914
上一篇: java 类初始化顺序
下一篇: 最长回文子串manacher算法
say_haha
博客等级 码龄12年 47粉丝 64原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值