多线程死锁

た 入场券 2022-05-24 04:09 494阅读 0赞

峨眉山月半轮秋,影入平羌江水流

Java线程的死锁一直都是经典的多线程问题;因为不同的线程都在等待根本不可能被释放的锁,从而导致所有的任务都不能继续执行;
示例代码:

  1. public class ThreadTest {
  2. public static void main(String[] args) {
  3. try{
  4. MyThread thread = new MyThread();
  5. thread.setName("a");
  6. Thread thread1 = new Thread(thread);
  7. thread1.start();
  8. Thread.sleep(100);
  9. thread.setName("b");
  10. Thread thread2 = new Thread(thread);
  11. thread2.start();
  12. }catch (Exception e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. }
  17. class MyThread implements Runnable{
  18. private String name;
  19. public Object obj1 = new Object();
  20. public Object obj2 = new Object();
  21. public void setName(String name) {
  22. this.name = name;
  23. }
  24. @Override
  25. public void run() {
  26. if (name.equals("a")) {
  27. synchronized (obj1) {
  28. try {
  29. System.out.println("name = " + name);
  30. Thread.sleep(3000);
  31. }catch (Exception e) {
  32. e.printStackTrace();
  33. }
  34. synchronized (obj2) {
  35. System.out.println("执行到obj2了");
  36. }
  37. }
  38. }
  39. if (name.equals("b")) {
  40. synchronized (obj2) {
  41. try {
  42. System.out.println("name = " + name);
  43. Thread.sleep(3000);
  44. }catch (Exception e) {
  45. e.printStackTrace();
  46. }
  47. synchronized (obj1) {
  48. System.out.println("执行到obj1了");
  49. }
  50. }
  51. }
  52. }
  53. }

运行结果:
这里写图片描述
这里是因为当name为a的时候,obj2一直被变量name等于的b那个线程占用,没有释放,同理,变量为b的obj1一直在等待上面的那个线程释放锁…从而形成死锁.
其实,通过JDK自带的工具也可以看到死锁的现象:
使用管理员的身份打开CMD窗口,进入到jdk安装目录的bin文件夹下.执行jps命令:
这里写图片描述
从而得知线程的ID为4856;然后执行jstack -l 4856:
在这里插入图片描述
由此可以看出,程序设计得出现了死锁;
所以,在设计程序时,要尽量避开死锁的陷阱;

发表评论

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

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

相关阅读

    相关 线(16)

    死锁是一个复杂且需要仔细管理的问题,在设计多线程和多进程系统时,开发者应当尽可能通过合理的设计来预防死锁的发生。如果死锁不可避免,那么应该有检测和解决死锁的机制。预防、避...

    相关 线

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

    相关 线

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

    相关 线代码

    死锁 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了

    相关 线

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

    相关 线

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