写一个生活中常见的死锁

来源:互联网 发布:新浪微博数据采集 编辑:程序博客网 时间:2024/06/06 06:50
package me.jea.array;/** * 我想到了一个有趣的问题,就是死锁。 * 假设一对夫妻回家吃饭,锁在老公身上。 * 老公因为喝醉了,在路边睡着了,于是老婆拿了他的锁进了门做饭。 * 饭做好了,结果打电话给老公,让老公进门。 * 但是老公没有锁啊,进不去,结果夫妻不能一同吃饭了。 *  * A线程调用wait()方法,释放同步锁,并且进入阻塞状态。 * B线程获取同步锁,唤醒A线程,并且要求A线程执行完毕,自己才会继续执行。 * 矛盾的是,B线程希望A线程先执行完自己再执行,但是B线程自己却不释放同步锁,这样就造成了死锁。 * @author jea * */public class DeadLock {public static void main(String[] args) {// 两个线程,一把锁,A线程睡了释放了锁,B线程获取了锁却必须等A线程执行完毕才执行。final Object obj = new Object();final Thread t1 = new Thread() {public void run() {synchronized (obj) {try {obj.wait();} catch (InterruptedException e) {System.out.println(e.getMessage());}}}};final Thread t2 = new Thread() {public void run() {synchronized (obj) {// 内部类访问局部变量,需要用final修饰局部变量。因为内部类的生命周期有可能超过局部变量的生命周期obj.notify();try {t1.join();} catch (InterruptedException e) {System.out.println(e.getMessage());}}}};t1.start();t2.start();}}