我是多线程的新手,我遇到了这个例子:

public class TestThread {

public static Object Lock1 = new Object();

public static Object Lock2 = new Object();

public static void main(String args[]) {

ThreadDemo1 T1 = new ThreadDemo1();

ThreadDemo2 T2 = new ThreadDemo2();

T1.start();

T2.start();

}

private static class ThreadDemo1 extends Thread {

public void run() {

synchronized (Lock1) {

System.out.println("Thread 1: Holding lock 1...");

try { Thread.sleep(10); }

catch (InterruptedException e) {}

System.out.println("Thread 1: Waiting for lock 2...");

synchronized (Lock2) {

System.out.println("Thread 1: Holding lock 1 & 2...");

}

}

}

}

private static class ThreadDemo2 extends Thread {

public void run() {

synchronized (Lock2) {

System.out.println("Thread 2: Holding lock 2...");

try { Thread.sleep(10); }

catch (InterruptedException e) {}

System.out.println("Thread 2: Waiting for lock 1...");

synchronized (Lock1) {

System.out.println("Thread 2: Holding lock 1 & 2...");

}

}

}

}

}

这会导致以下示例输出:

Thread 1: Holding lock 1...

Thread 2: Holding lock 2...

Thread 1: Waiting for lock 2...

Thread 2: Waiting for lock 1...

即,存在僵局.但是,如果我们改变在第二个线程中获得的锁的顺序,那么它现在看起来像这样:

public class TestThread {

public static Object Lock1 = new Object();

public static Object Lock2 = new Object();

public static void main(String args[]) {

ThreadDemo1 T1 = new ThreadDemo1();

ThreadDemo2 T2 = new ThreadDemo2();

T1.start();

T2.start();

}

private static class ThreadDemo1 extends Thread {

public void run() {

synchronized (Lock1) {

System.out.println("Thread 1: Holding lock 1...");

try { Thread.sleep(10); }

catch (InterruptedException e) {}

System.out.println("Thread 1: Waiting for lock 2...");

synchronized (Lock2) {

System.out.println("Thread 1: Holding lock 1 & 2...");

}

}

}

}

private static class ThreadDemo2 extends Thread {

public void run() {

synchronized (Lock1) {

System.out.println("Thread 2: Holding lock 1...");

try { Thread.sleep(10); }

catch (InterruptedException e) {}

System.out.println("Thread 2: Waiting for lock 2...");

synchronized (Lock2) {

System.out.println("Thread 2: Holding lock 1 & 2...");

}

}

}

}

}

它按预期工作,示例输出如下所示:

Thread 1: Holding lock 1...

Thread 1: Waiting for lock 2...

Thread 1: Holding lock 1 & 2...

Thread 2: Holding lock 1...

Thread 2: Waiting for lock 2...

Thread 2: Holding lock 1 & 2...

有人可以向我解释第一个导致死锁的情况,以及为什么第二个代码的更改会修复它?

在java程序中怎么造成死锁_java – 了解为什么在此实现中发生死锁相关推荐

  1. java程序员遇到的问题_Java 程序员平时最常遇到的故障:系统OOM (一)

    作为 Java 程序员而言,先不考虑自己系统外部依赖的缓存.消息队列.数据库等等东西挂掉,就我们自己系统本身而言,最常见的挂掉的原因是什么? 其实就是系统OOM,也就是所谓的内存溢出! 什么是内存溢出 ...

  2. java程序员就业发展方向_Java程序员有哪些职业发展方向?

    Java程序员的职业规划是非常清晰的,可以分为下面四种方向,可以根据自身条件选择适合自己的发展方向. A.程序员. 如果你觉得你喜欢代码,喜欢开发工作,那么一直做开发也是一件的不错的事,不过要考虑当你 ...

  3. java程序的运行环境简称_java程序的运行环境简称为什么?

    java程序的运行环境简称为JRE. Java运行环境(Java Runtime Environment,简称JRE)是一个软件,由太阳微系统所研发,JRE可以让计算机系统运行Java应用程序(Jav ...

  4. java程序员接私活_Java程序员接私活的项目-JeecgBoot

    Java程序员接私活的项目-JeecgBoot 近两年微服务大火,而对于Java程序员可实操的微服务框架就是SpringBoot,为什么大家都在使用微服务呢?- -第一,项目运行简单.相比较之前的 J ...

  5. java程序cpu突然飚高_Java 定位导致CPU飙升的代码过程

    线上的一个日志实时输出的程序曾经出过这样一个问题,刚开始上线java程序占用的CPU的资源很少,但是到了整点的时候,CPU直线飙高,直接到达100%根本没有要下降的趋势,唯一的方法只能杀掉它了,后面在 ...

  6. java程序员必备英语词汇_java程序员常用英文单词整理

    java程序员常用英文单词整理 money 金钱 price 价格 totalPrice 总价格 change 改变.变化 Unicode 统一码 ASCII ascii码表 child 孩子 run ...

  7. java程序运行过程数据丢失怎么办_java运行过程中OutOfMemoryError是什么原因?怎么解决...

    1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 3.代码中存在死循环或循环产生过多重复的对象实体: 4.使用的第三方软件 ...

  8. Java 程序员排行前 10 的错误,你有没有中?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 风一样的码农 来源| cnblogs.com/ ...

  9. java程序员遇到的问题_JAVA程序员最常遇见的10个异常

    程序员最不想遇到黑心老板外,异常也是难以不遇,现在列出10个最遇到的异常,大家可以参考一下. NO.1 java.lang.NullPointerException 这个异常大家肯定都经常遇到,异常的 ...

最新文章

  1. python php区别-PHP,Python,Java写出来的WEB程序有什么区别?
  2. 【CV】目标检测:常用名词与mAP评价指标的引出
  3. 【Linux】一步一步学Linux——expr命令(265)
  4. Asp.net禁用site.Mobile.Master
  5. javascript --- 对象原型
  6. 90后副教授一作发Science,刷新该校历史
  7. java filter注入_如何在Java Filter 中注入 Service
  8. 范伟导老师Sniffer课程资料
  9. mac苹果电脑如何查看mac地址
  10. oracle 产看执行计划_ORACLE数据库查看执行计划的方法
  11. 一级域名与二级域名之间的区别
  12. 支付宝飞行模式/转卡/转账/h5拉起支付
  13. web视频(点播/直播)播放器选型
  14. 电磁炉的三种工作形式_单管电路_半桥电路和全桥电路
  15. 自门控激活函数Swish
  16. 房地产楼盘三维地图带来的便利
  17. Python代码原来还可以这样玩——画出不同人物效果图,感觉很美好
  18. Mandatory condition is missing
  19. Android 隐私合规API检查方案
  20. 视频插帧(Video Frame interpolation)论文及源码

热门文章

  1. solidworks模板_SOLIDWORKS 高级BOM导出工具
  2. python云计算架构开发_云计算开发一般负责什么工作呢?更偏向于运维么?
  3. 读取设置config.ini配置
  4. 腾讯云发布第三代云服务器矩阵,开放更强计算力赋能产业智能化
  5. web自动化测试第12步:selenium中下拉框的解决方法(Select)
  6. JS控制CSS样式语法对照
  7. Android之旅--Handler与多线程
  8. 【转】JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解
  9. Vue和后台交互的方式
  10. Qt 模态对话框不模态的问题