这篇文章主要介绍Java多线程环境下如何实现死锁,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
1、死锁产生的条件
互斥:一次只有一个进程可以使用一个资源。其他进程不能访问已分配给其他进程的资源。
不可抢占:不能抢占进程已占有的资源
请求和保持:当一个进程等待其他进程释放资源时,继续占有已经分配的资源
循环等待:存在一个封闭的进程链,使得每个进程至少占有此链中下一个进程所需要的一个资源。
注意:前三个条件都只是死锁存在的必要条件,但不是充分条件。第四个条件是充分条件。以上条件同样适用于线程。
2、模拟多线程环境下死锁的产生
public class DeadLock { // 模拟两个资源 public static Object lock1 = new Object(); public static Object lock2 = new Object(); // 先申请lock1资源,再去申请lock2资源 public static void getLock1First(){ synchronized (lock1){ System.out.println("getlock1"); getLock2(); } } public static void getLock2(){ synchronized (lock2) { System.out.println("lock1->lock2"); } } // 先申请lock2资源,再申请lock1资源 public static void getlock2First(){ synchronized (lock2){ System.out.println("getlock2"); getLock1(); } } public static void getLock1(){ synchronized (lock1){ System.out.println("lock2->lock1"); } } public static void main(String[] args) { new Thread(){ @Override public void run() { // 太难把控线程运行的时机了 也有可能此线程执行完了lock1->lock2的顺序 // 直接死循环一直运行 // 总会刚好遇到线程1刚好获得lock1,线程2刚好获得lock2 while (true){ getLock1First(); } } }.start(); new Thread(){ @Override public void run() { while (true){ getlock2First(); } } }.start(); }}
死锁:
3、死锁的排查
先进入jdk安装的bin目录,启动命令行,输入命令jps查看运行的线程ID
死锁检测1:
执行jstack -l 线程ID命令
死锁检测2:
可以看到Thread-1
和Thread-2
都在相互等待对方持有的对象的monitor
锁释放。
以上是“Java多线程环境下如何实现死锁”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!