多线程的死锁问题

快来打我* 2022-01-29 10:21 543阅读 0赞

不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了死锁。

  1. package com.sy.iodemo;
  2. public class TestDeadLock implements Runnable{
  3. public int flag = 1;
  4. private static Object o1 = new Object();
  5. private static Object o2 = new Object();
  6. public static void main(String[] args){
  7. TestDeadLock td1 = new TestDeadLock();
  8. TestDeadLock td2 = new TestDeadLock();
  9. td1.flag = 1;
  10. td2.flag = 0;
  11. new Thread(td1).start();
  12. new Thread(td2).start();
  13. }
  14. public void run(){
  15. System.out.println("flag = "+flag);
  16. if(flag == 1){
  17. synchronized(o1){
  18. try{
  19. Thread.sleep(1000);
  20. }catch(Exception e){
  21. e.printStackTrace();
  22. }
  23. synchronized(o2){
  24. System.out.println("1");
  25. }
  26. }
  27. }
  28. if(flag == 0){
  29. synchronized(o2){
  30. try{
  31. Thread.sleep(1000);
  32. }catch(Exception e){
  33. e.printStackTrace();
  34. }
  35. synchronized(o1){
  36. System.out.println("0");
  37. }
  38. }
  39. }
  40. }
  41. }

当flag = 1(td1)的时候先锁定o1,睡眠1000ms,当td1在休眠的时候另一个flag=0的对象td2开始启动,再锁定o2,睡眠1000ms;
td1睡眠结束后需要锁定o2才能继续执行,而此时o2已被td2锁定;
td2睡眠结束后需要锁定o1才能继续执行,而此时o1已被td1锁定;
这个时候td1、td2互相等待,死锁发生。

发表评论

表情:
评论列表 (有 0 条评论,543人围观)

还没有评论,来说两句吧...

相关阅读

    相关 线09/线问题

    线程死锁问题 > 死锁 不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁 出现死锁后,不会出现异常,不会出现提示,只

    相关 线

    死锁: 如果一个资源被一个线程占用,而且无法释放线程资源,导致其他线程无法访问这个字段,一直处于等待状态,这样就会形成 线程死锁。 例子: package com.

    相关 线

    / 死锁:二个线程同时锁住一个变量时。 锁住一个变量之后,尽快操作完成解锁,解锁之前不要再锁住其它变量,否则会互锁(死锁)。 /

    相关 线

    峨眉山月半轮秋,影入平羌江水流 Java线程的死锁一直都是经典的多线程问题;因为不同的线程都在等待根本不可能被释放的锁,从而导致所有的任务都不能继续执行; 示例代码:

    相关 线

    同步锁使用的弊端:当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他的同步。这时容易引发一种现象:程序出现无限等待,这种现象我们称为死锁。这种情况能避免就避免掉。