使用线程池实现死锁
话不多说,开搞!
import java.util.concurrent.*;
/**
*使用线程池实现死锁
*@author com.xiong
*
* */
public class DeadLockDemo {
public static void main(String[] args) {
//创建两个资源供线程共同操作
Object resource1 =new Object();
Object resource2 =new Object();
//创建线程池
ArrayBlockingQueue<Runnable> arrayBlockingQueue = new ArrayBlockingQueue<Runnable>(5);
ExecutorService executor = new ThreadPoolExecutor(3,
5,
60,
TimeUnit.SECONDS,
arrayBlockingQueue, new ThreadPoolExecutor.AbortPolicy());
//使用线程池开启两个线程任务
executor.execute(new ThreadTask1(resource1,resource2));
executor.execute(new ThreadTask2(resource1,resource2));
//关闭线程池
executor.shutdown();
}
}
/**
* 任务1
* */
class ThreadTask1 implements Runnable {
Object resource1;
Object resource2;
public ThreadTask1() {
}
public ThreadTask1(Object resource1, Object resource2) {
this.resource1 = resource1;
this.resource2 = resource2;
}
@Override
public void run() {
synchronized (resource1) {
System.out.println(Thread.currentThread() + "获得资源1的锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "等待获得资源2的锁");
synchronized (resource2) {
System.out.println(Thread.currentThread() + "获得资源2的锁");
}
}
}
}
/**
* 任务2
* */
class ThreadTask2 implements Runnable {
Object resource1;
Object resource2;
public ThreadTask2() {
}
public ThreadTask2(Object resource1, Object resource2) {
this.resource1 = resource1;
this.resource2 = resource2;
}
@Override
public void run() {
synchronized (resource2) {
System.out.println(Thread.currentThread() + "获得资源2的锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "等待获得资源2的锁");
synchronized (resource1) {
System.out.println(Thread.currentThread() + "获得资源2的锁");
}
}
}
}
结果:死锁
分析:thread1获取resource1的锁后进入休眠1秒,此时thread2获取resource2的锁后进入休眠1秒,接着1秒过后,thread1尝试获取resource2的锁,此时resource2的锁被thread2占有未释放,同时thread2尝试获取resource1的锁,此时resource1的锁被thread1占有未释放,两条线程进入死锁,互相等待对方释放要获取的锁。