首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >死锁示例

死锁示例
EN

Stack Overflow用户
提问于 2013-04-26 05:24:50
回答 1查看 323关注 0票数 0
代码语言:javascript
复制
public class DeadLockExampleTwo {

public static void main(String[] args) {

    final DeadLockExampleTwo d = new DeadLockExampleTwo();
    final DeadLockExampleTwo d1 = new DeadLockExampleTwo();

    new Thread(new Runnable(){
        @Override
        public void run() {
            d.doSomething(d1);
        }
    }).start();

    new Thread(new Runnable(){
        @Override
        public void run() {
            d1.doSomething(d);
        }
    }).start();
}

    public synchronized void doSomething(DeadLockExampleTwo e) {
        System.out.println("Doing "+Thread.currentThread().getName());
        e.done(this);
    }
    public synchronized void done(DeadLockExampleTwo d) {
        System.out.println("Done");
    }
}

上面的代码有可能导致死锁。D来自doSomething方法上的第一线程锁,来自其他线程的d1获取同一方法上的锁。当两个对象都锁定在方法上时,到底会发生什么?它们是如何阻止对方执行"done“方法的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-26 05:30:47

死锁可能是因为第一个线程正在调用以下代码:

代码语言:javascript
复制
d.doSomething(d1);  // this is a synchronized method so locks on d
d1.done(...);       // this is a synchronized method so it tries to lock d1

而另一个线程可能同时调用:

代码语言:javascript
复制
d1.doSomething(d);  // this locks d1
d.done(...);        // this tries to lock d

我使用上面的“可能”这个词是因为有一个race condition。如果发生这种情况,则两个线程各有一个锁,并试图在另一个对象上获得锁。

正如我在your previous question中提到的,如果只运行一次,那么它很可能不会死锁,因为一个线程很可能会在另一个线程启动之前完成。您必须设置一个循环,并多次调用它才能使其锁定。

当你在一个方法上使用synchronized时,它会锁定有问题的对象的实例。在本例中,它锁定dd1

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

https://stackoverflow.com/questions/16224994

复制
相关文章

相似问题

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