所谓死锁,很多人知道就是两个现成互相等待对方占有的资源,而出现无限等待下去的情况,但是涉及到写代码的话不一定都能写出来,以下思路作为参考:
运行结果如下:
(1)创建两个线程,分别持有两个lock,比如是lock1和lock2
(2)线程1和线程2在run方法里分别先获取lock1和lock2的锁,之后分别sleep一段时间(避免一上来一个线程就获得了两个锁),然后线程1和线程2分别尝试去获取lock2和lock1
(3)此时因为锁已经被对方占有,并且对方还在等待自己持有的锁,这个时候死锁就发生了,代码如下:
import java.util.concurrent.locks.ReentrantLock;
/**
* Created by guishengran on 2017/8/18.
*/
class Task1 implements Runnable{
private ReentrantLock lock1;
private ReentrantLock lock2;
public Task1(ReentrantLock lock1,ReentrantLock lock2){
this.lock1 = lock1;
this.lock2 = lock2;
}
@Override
public void run() {
lock1.lock();
try{
System.out.println("Task1 get lock1,start sleep...");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
lock2.lock();
System.out.println("task1:You can never see me...because we are waiting each other T_T ");
}finally {
lock2.unlock();
lock1.unlock();
}
}
}
class Task2 implements Runnable{
private ReentrantLock lock1;
private ReentrantLock lock2;
public Task2(ReentrantLock lock1,ReentrantLock lock2){
this.lock1 = lock1;
this.lock2 = lock2;
}
@Override
public void run() {
lock2.lock();
try{
System.out.println("Task2 get lock2,start sleep...");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
lock1.lock();
System.out.println("task2:You can never see me...because we are waiting each other T_T ");
}finally {
lock1.unlock();
lock2.unlock();
}
}
}
public class DeadLockTest {
private static ReentrantLock lock1 = new ReentrantLock();
private static ReentrantLock lock2 = new ReentrantLock();
public static void main(String[] args){
// DeadLockTest testObj = new DeadLockTest();
Thread task1 = new Thread(new Task1(lock1,lock2));
Thread task2 = new Thread(new Task2(lock1,lock2));
task1.start();
task2.start();
}
}
运行结果如下:
Task1 get lock1,start sleep...
Task2 get lock2,start sleep...
Process finished with exit code 1