原文出自:https://blog.csdn.net/seesun2012
什么是死锁:
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
示例代码:
package com.seesun2012.csdn.cn;
/**
* 死锁
*
* @author seesun2012@163.com
*
*/
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() {
// 定义t1线程,锁定A变量睡眠2秒去抢占B的资源
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("进入线程t1");
synchronized (A) {
try {
Thread.currentThread();
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (B) {
System.err.println("1");
}
}
}
});
// 定义t2线程,锁定B变量去抢占A的资源
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("进入线程t2");
synchronized (B) {
synchronized (A) {
System.out.println("2");
}
}
}
});
// 启动线程
t1.start();
t2.start();
}
}
如何避免死锁?
避免一个线程同时获取多个锁。
避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。
尝试使用定时锁,使用lock.tryLock(timeout)来代替使用内部所机制。
对于数据库锁,加锁和解锁鼻息在一个数据库连接里进行,否则会出现解锁失败的情况。