线程死锁是指由于两个或者多个线程互相持有所需要的资源,导致这些线程一直处于等待其他线程释放资源的状态,无法前往执行,如果线程都不主动释放所占有的资源,将产生死锁。


当线程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。

 

产生原因:

  • 持有系统不可剥夺资源,去竞争其他已被占用的系统不可剥夺资源,形成程序僵死的竞争关系。

  • 持有资源的锁,去竞争锁已被占用的其他资源,形成程序僵死的争关系。

  • 信号量使用不当。

...

 

如线程A占有资源 1 的锁,去竞争资源 2 的锁;线程 B 占有资源 2 的锁,去竞争资源1的锁。

代码表现如下

package constxiong.concurrency.a022;

/**
* 测试死锁
* @author ConstXiong
* @date 2019-09-23 19:28:23
*/

public class TestDeadLock {

final static Object o1 = new Object();

final static Object o2 = new Object();

public static void main(String[] args) {
//先持有 o1 的锁,再去获取 o2 的锁
Thread t1 = new Thread() {

@Override
public void run() {
synchronized (o1) {
System.out.println("线程:" + Thread.currentThread().getName() + " 获取到 o1 对象的锁");
try {
System.out.println("休眠1秒");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println("线程:" + Thread.currentThread().getName() + " 去获取 o2 对象的锁");
synchronized (o2) {
System.out.println("线程:" + Thread.currentThread().getName() + " 成功获取 o2 对象的锁");
}
}
}

};

//先持有 o2 的锁,再去获取 o1 的锁
Thread t2 = new Thread() {

@Override
public void run() {
synchronized (o2) {
System.out.println("线程:" + Thread.currentThread().getName() + " 获取到 o2 对象的锁");
try {
System.out.println("休眠1秒");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println("线程:" + Thread.currentThread().getName() + " 去获取 o1 对象的锁");
synchronized (o1) {
System.out.println("线程:" + Thread.currentThread().getName() + " 成功获取 o1 对象的锁");
}
}
}

};


t1.start();
t2.start();
}

}

 

测试结果,发生死锁,打印如下

线程:Thread-0 获取到 o1 对象的锁
休眠1秒
线程:Thread-1 获取到 o2 对象的锁
休眠1秒
线程:Thread-1 去获取 o1 对象的锁
线程:Thread-0 去获取 o2 对象的锁

 


更多相关文章

  1. Java 中线程池包含哪些状态?
  2. 如何创建、启动 Java 线程?
  3. Executors如何创建线程池?
  4. 什么是线程?什么是进程?为什么要有线程?有什么关系与区别?
  5. 什么是线程池?
  6. 线程包括哪些状态?状态之间是如何转变的?
  7. 什么是守护线程?
  8. 如何优雅地停止一个线程?
  9. java多线程(11)AtomicBoolean原子类分析

随机推荐

  1. Android Service的生命周期图解
  2. react native 0.49 android版本热更新
  3. 如何在android地图中使用TextWatcher显示
  4. 如何从firebase中获取唯一ID内的数据
  5. 对APK进行解包和二次打包(Android)
  6. 数据未显示在Listview中
  7. Android 属性动画(Property Animation)
  8. ADT下搭建JNI编译环境
  9. Android 待机功能流程分析
  10. HTC One X的S720e采用了Beats Audio锁定