写点什么

Java 多线程 - 死锁的出现和解决

  • 2022 年 4 月 18 日
  • 本文字数:1165 字

    阅读完需:约 4 分钟

导致死锁的根源在于不适当地运用“synchronized”关键词来管理线程对特定对象的访问.“synchronized”关键词的作用是,确保在某个时刻只有一个线程被允许执行特定的代码块,因此,被允许执行的线程首先必须拥有对变量或对象的排他性访问权.当线程访问对象时,线程会给对象加锁,而这个锁导致其它也想访问同一对象的线程被阻塞,直至第一个线程释放它加在对象上的锁.


对 synchronized 不太了解的话请点击[这里](()


  • 举个例子


死锁的产生大部分都是在你不知情的时候.我们通过一个例子来看下什么是死锁.


1.synchronized 嵌套.


synchronized 关键字可以保证多线程再访问到 synchronized 修饰的方法的时候保证了同步性.就是线程 A 访问到这个方法的时候线程 B 同时也来访问这个方法,这时线程 B 将进行阻塞,等待线程 A 执行完才可以去访问.这里就要用到 synchronized 所持有的同步锁.具体来看代码:


//首先我们先定义两个 final 的对象锁.可以看做是共有的资源.final Object lockA = new Object();final Object lockB = new Object();//生产者 Aclass ProductThreadA implements Runnable{@Overridepublic void run() {//这里一定要让线程睡一会儿来模拟处理数据 ,要不然的话死锁的现象不会那么的明显.这里就是同步语句块里面,首先获得对象锁 lockA,然后执行一些代码,随后我们需要对象锁 lockB 去执行另外一些代码.synchro 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 nized (lockA){//这里一个 log 日志 Log.e("CHAO","ThreadA lock lockA");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}synchronized (lockB){//这里一个 log 日志 Log.e("CHAO","ThreadA lock lockB");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}


}}}}//生产者 Bclass ProductThreadB implements Runnable{//我们生产的顺序真好好生产者 A 相反,我们首先需要对象锁 lockB,然后需要对象锁 lockA.@Overridepublic void run() {synchronized (lockB){//这里一个 log 日志 Log.e("CHAO","ThreadB lock lockB");try {Thread.sleep(2000);} catch (InterruptedException e) {e Java 开源项目【ali1024.coding.net/public/P7/Java/git】 .printStackTrace();

分享

首先分享一份学习大纲,内容较多,涵盖了互联网行业所有的流行以及核心技术,以截图形式分享:


(亿级流量性能调优实战+一线大厂分布式实战+架构师筑基必备技能+设计思想开源框架解读+性能直线提升架构技术+高效存储让项目性能起飞+分布式扩展到微服务架构.........实在是太多了)


其次分享一些技术知识,以截图形式分享一部分:


Tomcat 架构解析:



算法训练+高分宝典:



Spring Cloud+Docker 微服务实战:



最后分享一波面试资料:


切莫死记硬背,小心面试官直接让你出门右拐


1000 道互联网 Java 面试题:



Java 高级架构面试知识整理:



用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
Java多线程-死锁的出现和解决_Java_爱好编程进阶_InfoQ写作平台