首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两个锁的死锁的可能性?

两个锁的死锁的可能性?
EN

Stack Overflow用户
提问于 2019-08-07 23:39:44
回答 2查看 178关注 0票数 0

当线程1调用one,线程2调用two时,代码会死锁吗?也就是说,内部锁的获取是否可以重新排序到外部锁的获取之前(从另一个线程的POV )?

代码语言:javascript
复制
private final Object foo = new Object();
synchronized  void one() {
    // ...
    synchronized(this.foo) {
       // ...
    }
    // ...
}

synchronized void two() {
    // ...
    synchronized(this.foo) {
       // ...
    }
    // ...
}
EN

回答 2

Stack Overflow用户

发布于 2019-08-07 23:45:53

不,这不会死锁。

当调用同步的方法时,this的固有锁在方法体执行之前被锁定。在这里,线程1或线程2将运行其方法,而另一个线程将无法锁定this.foo的固有锁,因此this锁的所有者将能够锁定this.foo

票数 0
EN

Stack Overflow用户

发布于 2019-08-08 00:06:01

因此,对于一个简单的测试:

代码语言:javascript
复制
class LockTest implements Runnable {
    public final Object foo = new Object();
    boolean runOne;

    public LockTest(boolean runOne) {
        this.runOne = runOne;
    }

    synchronized void  one() {
        System.out.println("runnin one function");
        synchronized(this.foo) {
            try {
                System.out.println("Enter Sleep function one");
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    synchronized void  two() {
        System.out.println("running two function");
        synchronized(this.foo) {
            try {
                System.out.println("enter sleep function two");
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void run() {
        if(runOne)
        one();
        else
            two();
    }
}

在主类中使用以下代码:

代码语言:javascript
复制
while (true)
        {
            LockTest document2 = new LockTest(true);
            LockTest document3 = new LockTest(false);
            Thread tread1 = new Thread(document2);
            Thread tread2 = new Thread(document3);
            tread1.start();
            tread2.start();
            a++;
            if(a==10)
                break;

        }

我们没有锁定,甚至没有使用线程转储进行监视,一切都正常。为什么?因为每次我们用新对象foo初始化一个新的Thread。但是如果该对象被声明为静态的,那么它将是一个锁,其他线程需要等待。所以从我的测试和POV来看。不,它不会死锁的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57397992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档