java 线程死锁是什么?怎么办?

为什么会出现线程死锁:

ps. 这里只给出java的例子,但思想都是一样的

  1. 使用了同步机制,资源同一时间只能被单个线程占有
  2. 占有的资源不可以强行剥夺(外部无法操作资源)
  3. 多线程互相等待彼此占有的资源锁释放

举个例子

public class DeadLockA  implements Runnable{
    @Override
    public void run() {
        try {
            System.out.println(Thread.currentThread().getName() +" DeadLockA :start");
            while(true) {
                synchronized (Cloding.b) {
                    System.out.println(Thread.currentThread().getName() + " DeadLockA :syn b");
                    Thread.sleep(2000);
                    synchronized (Cloding.a) {
                        System.out.println(Thread.currentThread().getName() + " DeadLockA :syn a");
                    }
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public class DeadLockB  implements Runnable {
        @Override
        public void run() {
            try {
            System.out.println(Thread.currentThread().getName() +" DeadLockB :start");
            while(true) {
                synchronized (Cloding.a) {
                    System.out.println(Thread.currentThread().getName() + " DeadLockB :syn a");
                    Thread.sleep(2000);
                    synchronized (Cloding.b) {
                        System.out.println(Thread.currentThread().getName() + " DeadLockB :syn b");
                    }
                }
            }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
}
//运行入口类
public class Cloding {
    //public static Integer a = 0;
    //public static Integer b = 0;
    public static String a = "ok";
    public static String b = "fine";
    public static void main(String[] args) {
        new Thread(new DeadLockA()).start();
        new Thread(new DeadLockB()).start();
    }
}

运行结果:
java 线程死锁是什么?怎么办?_第1张图片

细心的可能发现了,运行入口类里面a ,b字段还有一个Integer类型的被我注释掉,我开始使用这个类型做测试,发现一直有问题,Integer类型的对象无法按照代码逻辑正常运行,怀疑Integer这种基本类型的包装类有特殊属性

Integer 的 运行结果
java 线程死锁是什么?怎么办?_第2张图片

2018/12/27日
没有找到 Integer 锁不按代码逻辑走的原因
但是基本数据类型可以通过AtomicInteger 这种为concurrent 设计的类来解决同步问题

2020/03/05
看到有人回复我,这里给出我的理解

  1. a/b 之间:Integer是包装类,内部初始化了-128~127之间的值,直接赋值,会从初始化池中取对象,既然对象指向同一个,自然对象锁锁不住
  2. c/d之间:为什么new Integer的对象又是不同的呢?不要忘了,java语言new表示新创建对象,与是不是Integer已经无关。
    java 线程死锁是什么?怎么办?_第3张图片

你可能感兴趣的:(并发)