这段代码怎么会导致死锁?

Dmi*_*sev 0 java scjp

在通过SCJP6考试模拟器时,我发现了这样的问题:

class Clerk implements Runnable {

    private Record A, B;

    public Clerk(Record a, Record b) {
        A = a;
        B = b;
    }

    public void run() {
        while(true) {
            doStuff(A, B);
        }
    }

    public synchronized void doStuff(Record a, Record b) {
        synchronized(a) {
        synchronized(b) {
            a.add(1);
            b.add(-1);
        }}
    }

}
Run Code Online (Sandbox Code Playgroud)

然后

Record a = new Record();
Record b = new Record();

new Thread(new Clerk(a, b)).start();
new Thread(new Clerk(a, b)).start();
Run Code Online (Sandbox Code Playgroud)

答案说这段代码导致死锁,但我不明白 - 这究竟是怎么回事?有人可以帮我解决这个问题吗?

ass*_*ias 9

除了它不编译之外,该代码中没有死锁.这段代码肯定会造成死锁:

new Thread(new Clerk(a, b)).start();
new Thread(new Clerk(b, a)).start();
Run Code Online (Sandbox Code Playgroud)

因此,如果问题是:Clerk该类是否可能成为僵局的来源?然后答案是肯定的.

编辑

应该快速死锁的简短示例.如果像原始问题一样使用a和b,程序运行正常.

public class Test1 {

    public static void main(String[] args) {
        Record a = new Record();
        Record b = new Record();

        new Thread(new Clerk(a, b)).start();
        new Thread(new Clerk(b, a)).start();
    }

    static class Record {
    }

    static class Clerk implements Runnable {

        private Record A, B;

        public Clerk(Record a, Record b) {
            A = a;
            B = b;
        }

        public void run() {
            while (true) {
                System.out.println("in thread " + Thread.currentThread());
                for (int i = 0; i < 10000; i++) {
                    doStuff(A, B);
                }
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                }
            }
        }

        public synchronized void doStuff(Record a, Record b) {
            synchronized (a) {
                synchronized (b) {
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1我怀疑这个问题在某处被错误地复制了. (2认同)
  • @LewsTherin:一个人可以锁定`a`,然后才能锁定`b`,另一个已经拥有但正在等待'a`. (2认同)