java-synchronized 嵌套使用代码详解
发布时间 - 2026-01-11 03:18:59 点击率:次当synchronized使用过多时,可能会造成死锁,那么死锁到底是怎么一回事呢。先看下面的代码,实现死锁:
//死锁的实现 classA { publicvoidget(){ System.out.println("A说:我开始启动了,B,给我你的资源"); } publicvoidsay(){ System.out.println("A获得资源"); } } classB { publicvoidget(){ System.out.println("B说:我开始启动了,A,给我你的资源"); } publicvoidsay(){ System.out.println("B获得资源"); } } classMyThreadimplementsRunnable { publicstaticAa=newA(); publicstaticBb=newB(); publicbooleanflag=false; publicvoidrun(){ if(flag){ synchronized(a){ a.get(); try{ Thread.sleep(500); }catch(InterruptedExceptione){} synchronized(b){ //此同步代码块在另一同步代码块里 a.say(); } } }else{ synchronized(b){ b.get(); try{ Thread.sleep(500); }catch(InterruptedExceptione){} synchronized(a){ //此同步代码块在另一同步代码块里 b.say(); } } } } } publicclassDemo24 { publicstaticvoidmain(Stringargs[]){ MyThreadmt1=newMyThread(); MyThreadmt2=newMyThread(); mt1.flag=true; mt2.flag=false; Threadth1=newThread(mt1); Threadth2=newThread(mt2); th1.start(); th2.start(); } }
以上代码由于 synchronized 的同步造成了死锁,死锁是两个或多个线程同时等待对方的完成,而程序无法继续执行。在解释代码前,首先要明白synchronized到底是怎么一回事。synchronized 定义同步,那么同步的什么,什么和什么同步了?
首先,我们得知道,什么是锁。在java中,每一个对象都有一个内部锁,如果以方法或代码块用 synchronized 进行声明,那么对象的锁将保护整个方法或代码块,要调用这个方法或者执行这个代码块,必须获得这个对象的锁。而且,任何时候都只能有一个线程对象执行被保护的代码
在以上代码中,在线程th1启动后,他就获得了a的锁,同时当其休眠完毕,求会申请获得b的锁,而此时,他的a锁没有放弃。在线程th2启动后,他就获得了b的锁,同时当其休眠完毕,求会申请获得a的锁,而此时,他的b锁没有放弃。
两方都握有自己的锁不放弃,而同时申请另一方的锁,所以,此时就造成了死锁。
同步,同步的就是线程和对象,将线程和对象进行绑定,获取对象的锁。
注意:通过以上代码可以发现,死锁的必要条件是不放弃已有的锁,而同时申请新锁。所以,要想实现死锁,就会有synchronized的嵌套。
这样才能同时操作两个以上的锁,从而造成死锁。
总结
以上就是本文关于java-synchronized 嵌套使用代码详解的全部内容,希望对大家有所帮助。
# java
# synchronized
# 嵌套
# java多个if嵌套使用
# Java中synchronized实现原理详解
# java多线程之线程
# 进程和Synchronized概念初解
# 深入理解java内置锁(synchronized)和显式锁(ReentrantLock)
# 聊聊Java并发中的Synchronized
# Java线程之线程同步synchronized和volatile详解
# Java编程synchronized与lock的区别【推荐】
# 解析Java编程之Synchronized锁住的对象
# java中volatile和synchronized的区别与联系
# 解决Maven 项目报错 java.httpservlet和synchronized使用方法
# Java synchronized关键_动力节点Java学院整理
# 浅析Java多线程同步synchronized
# 死锁
# 给我
# 他就
# 是怎么
# 造成了
# 不放弃
# 自己的
# 获得了
# 都有
# 多个
# 启动了
# 要想
# 而此时
# 能有
# 必要条件
# 时就
# 使用过
# 都只
# 绑定
# 先看
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何用好域名打造高点击率的自主建站?
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
高防服务器租用首荐平台,企业级优惠套餐快速部署
WEB开发之注册页面验证码倒计时代码的实现
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
如何在万网利用已有域名快速建站?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
详解jQuery停止动画——stop()方法的使用
Java类加载基本过程详细介绍
香港服务器租用每月最低只需15元?
英语简历制作免费网站推荐,如何将简历翻译成英文?
如何基于PHP生成高效IDC网络公司建站源码?
Laravel如何配置任务调度?(Cron Job示例)
如何快速搭建安全的FTP站点?
如何快速使用云服务器搭建个人网站?
再谈Python中的字符串与字符编码(推荐)
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
如何用低价快速搭建高质量网站?
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
实现点击下箭头变上箭头来回切换的两种方法【推荐】
zabbix利用python脚本发送报警邮件的方法
如何在云主机上快速搭建多站点网站?
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
linux top下的 minerd 木马清除方法
如何在云指建站中生成FTP站点?
浅述节点的创建及常见功能的实现
免费网站制作appp,免费制作app哪个平台好?
Laravel如何实现本地化和多语言支持?(i18n教程)
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
网易LOFTER官网链接 老福特网页版登录地址
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
高性能网站服务器配置指南:安全稳定与高效建站核心方案
如何在宝塔面板中创建新站点?
如何用PHP快速搭建高效网站?分步指南
Swift中switch语句区间和元组模式匹配
详解jQuery中的事件
简单实现Android文件上传
详解MySQL数据库的安装与密码配置
常州企业网站制作公司,全国继续教育网怎么登录?
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
如何在建站之星绑定自定义域名?
Laravel集合Collection怎么用_Laravel集合常用函数详解
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践
Laravel distinct去重查询_Laravel Eloquent去重方法
如何在阿里云虚拟服务器快速搭建网站?
详解Huffman编码算法之Java实现
如何在阿里云域名上完成建站全流程?

