给个死锁的例子:
public class TestDeadLock implements Runnable{
public int flag = 0;
static Object o1 = new Object();
static Object o2 = new Object();
@Override
public void run() {
if(flag == 0){
synchronized (o1){
System.out.println("flag=0获取Object1的锁");
try{
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
synchronized (o2){
System.out.println("flag=0获取Object2的锁");
}
}
}
if(flag == 1){
synchronized (o2){
System.out.println("flag=1获取Object2的锁");
try{
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
synchronized (o1){
System.out.println("flag=1获取Object1的锁");
}
}
}
}
public static void main(String[] args) {
TestDeadLock td1 = new TestDeadLock();
TestDeadLock td2 = new TestDeadLock();
td1.flag = 0;
td2.flag = 1;
new Thread(td1).start();
new Thread(td2).start();
}
}
Object1和Object2定为static,保证实例只有一份:
输出结果:(产生死锁)
flag=0获取Object1的锁
flag=1获取Object2的锁
。。。。。(程序发生死锁)
上诉代码经过以下修改可以避免死锁的发生:
public class TestDeadLock implements Runnable{
public int flag = 0;
static Object o1 = new Object();
static Object o2 = new Object();
@Override
public void run() {
if(flag == 0){
synchronized (o1){
System.out.println("flag=0获取Object1的锁");
try{
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
}
synchronized (o2){
System.out.println("flag=0获取Object2的锁");
}
}
if(flag == 1){
synchronized (o2){
System.out.println("flag=1获取Object2的锁");
try{
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
}
synchronized (o1){
System.out.println("flag=1获取Object1的锁");
}
}
}
public static void main(String[] args) {
TestDeadLock td1 = new TestDeadLock();
TestDeadLock td2 = new TestDeadLock();
td1.flag = 0;
td2.flag = 1;
new Thread(td1).start();
new Thread(td2).start();
}
}
输出结果:
flag=0获取Object1的锁
flag=1获取Object2的锁
flag=1获取Object1的锁
flag=0获取Object2的锁
避免死锁的方法:
(1)上述demo最常见,在占有一个资源的时候继续申请占有另外一个资源,这种情况下在其他线程试图申请前一个线程占有的资源时容易发生死锁。避免嵌套申请锁。
(2)还有一些方法:
- 加锁顺序(线程按照一定的顺序加锁)
- 加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)
- 死锁检测
参考博客:http://blog.csdn.net/ls5718/article/details/51896159