【并发编程013】为什么会出现死锁?写出死锁的代码?
2023-09-27 14:29:27 时间
为什么会出现死锁?写出死锁的代码?
死锁的产生必须具备以下四个条件。
- 互斥条件: 指线程对己经获取到的资源进行排它性使用, 即该资源同时只由一个线程 占用 。 如果此时还有其他线程请求获取该资源, 则请求者只能等待, 直至占有资源的 线程释放该资源。
- 请求并持有条件: 指一个线程己经持有了至少一个资源, 但又提出了新的资源请求, 而新资源己被其他线程占有, 所以当前线程会被阻塞, 但阻塞的同时并不释放自己己 经获取的资源。
- 不可剥夺条件: 指线程获取到的资源在自己使用完之前不能被其他线程抢占, 只有在 自己使用完毕后才由自己释放该资源。
- 环路等待条件: 指在发生死锁时, 必然存在一个线程→资源的环形链, 即线程集合 {T0 , T1, T2, …, Tn} 中的T0 正在等待一个T1 占用的资源, T1 正在等待T2 占用的资源, ……Tn 正在等待己被T0 占用的资源。
public class DeadLockDemo {
private static String A = "A";
private static String B = "B";
public static void main(String[] args) {
new DeadLockDemo().deadLock();
}
private void deadLock() {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
//线程1获取A的锁
synchronized (A) {
try {
Thread.currentThread().sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (B) {
System.out.println("1");
}
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
//线程2获取B的锁
synchronized (B) {
//A对象已经被线程1持有
synchronized (A) {
System.out.println("2");
}
}
}
});
t1.start();
t2.start();
}
}
相关文章
- 尼恩技术圣经+高并发系列,帮你 实现技术自由,完成职业升级, 薪酬猛涨!
- QT高级编程技巧(二)-- 编写多线程和并发应用
- Java并发编程(08):Executor线程池框架
- java并发编程之CyclicBarrier
- 【转】Java并发编程:synchronized
- 测试并发应用(三)监控Executor框架
- 并发编程--JVM内部锁升级过程
- 并发编程--阻塞队列使用总结
- JavaSE高级:JUC并发(下)
- 《Haskell并行与并发编程》——第1章,第1.2节工具和资源
- 《Java线程与并发编程实践》—— 1.2 操作更高级的线程任务
- 为啥并发编程,要从 JDK 源码里去学?
- 《Python编程实战:运用设计模式、并发和程序库创建高质量程序》—— 2.7 代理模式
- boost并发编程boost::atomic
- Java并发编程:并发容器之ConcurrentHashMap(转载)
- php结合redis实现高并发下的抢购、秒杀功能
- 并发编程之常用概念类和框架
- 并发编程之ConcurrentHashMap jdk1.7和1.8源码剖析
- 学习笔记(33):Python网络编程&并发编程-进程池线程池
- 学习笔记(20):Python网络编程&并发编程-互斥锁与join的区别
- 学习笔记(11):Python网络编程&并发编程-粘包底层原理分析
- 学习笔记(07):Python网络编程&并发编程-客户端与服务端代码bug修复
- 【Java 并发编程】Java 线程的生命周期