美文网首页
死锁示例

死锁示例

作者: keepSwiming | 来源:发表于2017-06-23 16:35 被阅读11次

    死锁示例

    由于两个锁对象lock1,lock2是static只存在一份,导致两个线程执行时会相互等待已经被获得的琐对象,导致死锁产生.
    如果将static去掉,2个锁对象就是线程独有的变量,不会被别的线程发现,因此不会产生死锁.

    public class DeadLock implements Runnable{
        private String tag;
        private static Object lock1 = new Object();
        private static Object lock2 = new Object();
        
        public void setTag(String tag){
            this.tag = tag;
        }
        
        @Override
        public void run() {
            if(tag.equals("a")){
                synchronized (lock1) {
                    try {
                        System.out.println("当前线程 : "  + Thread.currentThread().getName() + " 进入lock1执行");
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (lock2) {
                        System.out.println("当前线程 : "  + Thread.currentThread().getName() + " 进入lock2执行");
                    }
                }
            }
            if(tag.equals("b")){
                synchronized (lock2) {
                    try {
                        System.out.println("当前线程 : "  + Thread.currentThread().getName() + " 进入lock2执行");
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (lock1) {
                        System.out.println("当前线程 : "  + Thread.currentThread().getName() + " 进入lock1执行");
                    }
                }
            }
        }
        
        public static void main(String[] args) {
            
            DeadLock d1 = new DeadLock();
            d1.setTag("a");
            DeadLock d2 = new DeadLock();
            d2.setTag("b");
             
            Thread t1 = new Thread(d1, "t1");
            Thread t2 = new Thread(d2, "t2");
             
            t1.start();
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            t2.start();
        }   
    }
    

    相关文章

      网友评论

          本文标题:死锁示例

          本文链接:https://www.haomeiwen.com/subject/ulbccxtx.html