未被static修饰的对象为什么无法被锁定

今天被同事问到了一个死锁的问题, 于是写了一个死锁的小程序,结果执行后发现无法形成死锁

package Thread;

/**
 * 利用synchronized制造死锁
 */
public class DeadLock implements Runnable{
    public int flag = 0;
    /**
     * 被锁对象一定要是静态的 用static修饰的, 如果不用static修饰
     * 每个线程执行的时候都会创建一个各自的对象,锁的也就是各自的对象,不会死锁
     * 如果对象被static修饰后,就是永远都是锁定这个对象,会形成死锁
     */
    //static Object o1 = new Object(),o2 = new Object();
    Object o1 = new Object(),o2 = new Object();
    public void run(){
        System.out.println(flag);
        if(flag == 0){
            synchronized (o1){
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o2){
                    System.out.println("t1=1");
                }
            }

        }
        if(flag == 1){
            synchronized (o2){
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o1){
                    System.out.println("t2=2");
                }
            }

        }



    }
    public static void main(String[] args){
        DeadLock dl1 =  new DeadLock();
        DeadLock dl2 =  new DeadLock();
        dl1.flag = 0;
        dl2.flag = 1;
        Thread td1 = new Thread(dl1);
        Thread td2 = new Thread(dl2);
        td1.start();
        td2.start();
    }
}

`

**问题原因见代码注释, 是不是恍然大悟!!!!**

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值