多线程死锁

雨点打透心脏的1/2处 2022-03-08 07:50 491阅读 0赞

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

synchronzied(A锁){

  1. synchronized(B锁)\{
  2. \}

}

  1. /**
  2. *
  3. *创建锁对象
  4. *
  5. */
  6. public class Lock {
  7. //这里用private封装,为了不让外面随便造锁,限制只能有A,B锁个一把,这样容易出现死锁
  8. //即A同学和B同学想相互串门,可是没人只有一把自己房间的钥匙,而且各自都不愿意先给,于是死锁
  9. private Lock() {};
  10. public static final Object lockA =new Object();
  11. public static final Object lockB = new Object();
  12. //这里使用static 为了让外界可以通过类名调用成员变量lockA和lockB
  13. //因为外面无法创建Lock对象,为了让外面在不创对象的情况下调用,加了static,通过类名加变量名访问
  14. }
  15. /**
  16. * 线程任务类
  17. *
  18. */
  19. import java.util.Random;
  20. public class ThreadTask implements Runnable {
  21. int x = new Random().nextInt(1);//用随机数随机获取0、1,来模拟CPU随机分配执行权的行为
  22. @Override
  23. public void run() {
  24. while(true) {
  25. if(x%2==0) {
  26. //情况一
  27. // 先执行A再执行B:即A同学先拿了A门的钥匙去开A门,然后打算开B门
  28. synchronized(Lock.lockA) {
  29. System.out.println("A同学...开A门");
  30. synchronized(Lock.lockB) {
  31. System.out.println("A同学...开B门");
  32. }
  33. }
  34. }else {
  35. //情况二
  36. // 先执行B执行A:B同学先拿了B门的钥匙,去开B门,然后打算开A门
  37. synchronized(Lock.lockB) {
  38. System.out.println("B同学...开B门");
  39. synchronized(Lock.lockA) {
  40. System.out.println("B同学...开A门");
  41. }
  42. }
  43. }
  44. x++;
  45. }
  46. }
  47. /**
  48. *
  49. * 线程测试类
  50. *
  51. */
  52. public class ThreadDemo {
  53. public static void main(String[] args) {
  54. //创建Runnable的实现类对象
  55. ThreadTask tt = new ThreadTask();
  56. //把Runnable实现类对象加入线程中,创建2个线程
  57. Thread t1 = new Thread(tt);
  58. Thread t2 = new Thread(tt);
  59. t1.start();
  60. t2.start();
  61. }
  62. *********************************************************
  63. 输出结果:A同学...开A
  64.      A同学...开B
  65.      B同学...开B
  66.      B同学...开A
  67.      A同学...开A
  68.      B同学...开B
  69. 结论:A同学或者B同学,一个人先后拿走两把钥匙时,线程是正常运行的,一旦A拿了A锁进去A门的时候,CPU突然让B开始执行,让B拿了B锁进入B门,结果A需要B锁,B也需要A锁,两者又不能后退
  70. 于是死锁现象发生了。
  71. 等待唤醒机制
  72. 线程之间的通信:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同。通过一定的手段使各个线程能有效的利用资源。而这种手段即等待唤醒机制

转载:https://www.cnblogs.com/lyjblogs/p/7888646.html

发表评论

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

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

相关阅读

    相关 线(16)

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

    相关 线

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

    相关 线

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

    相关 线代码

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

    相关 线

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

    相关 线

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