死锁

Posted 七月流星丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了死锁相关的知识,希望对你有一定的参考价值。

话不多说,直接上代码:

 1 public class DeadlockTest {
 2     private static final Object o1 = new Object();
 3     private static final Object o2 = new Object();
 4 
 5     public static void main(String[] args) {
 6         new Thread(new Runnable() {
 7             public void run() {
 8                 for (; ; ) {
 9                     synchronized (o1) {
10                         System.out.println("A线程获取o1锁");
11                         synchronized (o2) {
12                             System.out.println("继续执行要持有o2锁");
13                         }
14                     }
15                 }
16             }
17         }, "A").start();
18         new Thread(new Runnable() {
19             public void run() {
20                 for (; ; ) {
21                     synchronized (o2){
22                         System.out.println("B线程获取o2锁");
23                         synchronized (o1){
24                             System.out.println("继续执行要持有o1锁");
25                         }
26                     }
27                 }
28             }
29         }, "B").start();
30     }
31 }

 

 通过jconsole分析工具可以看到确实存在死锁情况,B锁被A线程持有,A锁被B线程持有,线程A和线程B相互等待对方所持有锁的释放,而导致系统不能继续运行下去

 那么,在我们实际做项目时候,如何避免死锁的发生呢?

1、避免一个线程同时获取多个锁

2、避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源

3、尝试使用定时锁,使用lock.tryLock(timeout);来代替使用内部锁机制

4、对于数据库锁,加锁和解锁必须在同一个数据库连接里,否则出现解锁失败的情况

 

以上是关于死锁的主要内容,如果未能解决你的问题,请参考以下文章

Java并发编程实战 04死锁了怎么办?

手撕死锁代码

手撕死锁代码

手撕死锁代码

Visual Studio 代码分析死锁

死锁原理及代码