开发者社区> 问答> 正文

static Object obj = new Object(),静态对象和非静态对象有什么区别

下面这段程序中,Object不用static 修饰时不会产生死锁,加上static就会产生死锁,为什么会这样呢?

public class TestDeadLock implements Runnable{
     static Object o1 = new Object();     //在Object前面加static与不加对synchronized有什么影响,为什么执行结果不一样
     static Object o2 = new Object();    //synchronized参数都可以是什么
     public  int flag = 0;
    public static void main(String[] args){
        TestDeadLock td1 = new TestDeadLock();
        TestDeadLock td2 = new TestDeadLock();
        td1.flag=1;
        td2.flag=0;
        Thread t1 = new Thread(td1);
        Thread t2 = new Thread(td2);
        t1.start();
        t2.start();
    }

    public void run(){
        System.out.println("flag="+flag);
        if(flag==0){
            synchronized(o1){
                try{
                    Thread.sleep(1000);
                }catch(InterruptedException e){
                    e.printStackTrace();
                    }

                synchronized(o2){
                    System.out.println("hello");
                }
            }
        }
        if(flag==1){
            synchronized(o2){
                try{
                    Thread.sleep(1000);
                }catch(InterruptedException e){
                    e.printStackTrace();
                    }

                synchronized(o1){
                    System.out.println("ok");
                }
            }
        }
    }
}

展开
收起
蛮大人123 2016-03-17 17:26:25 4454 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    你在锁定o1的代码块内锁定o2,在锁定o2的代码块内锁定o1
    因此,如果两个线程并发各自锁住了o1 o2,并且试图去锁对方,那么程序死锁而不加static,每个线程有一个自己的实例,锁的不是同一个o1 o2

    2019-07-17 19:05:41
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
建立联系方法之一 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载