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实现  如何在阿里云域名上完成建站全流程?