Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
520 views
in Technique[技术] by (71.8m points)

multithreading - Java - Thread.join( ) does not release the lock

i debug this code and i don't understand why i get deadlock. When you execute this code, it looks like the main thread lock in the join method while the other thread is waiting to acquire the lock.

public class Foo {

private final Thread thread;

public Foo() {
    thread = new Thread(new Bar(), "F");
    thread.start();
}

public void run() {
    synchronized (this) {
        thread.interrupt();
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Foo run method");
    }
}

private final class Bar implements Runnable {

    @Override
    public void run() {
        synchronized (Foo.this) {
            System.out.println("Bar run method");
        }
    }

}

public static void main(String[] args) throws InterruptedException {
    final Foo foo = new Foo();
    foo.run();
}

}

Thanks for your help!

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

That's because Thread.join() doesn't release any locks. You've designed a perfectly working deadlock, where Thread-1 is waiting for Thread-2 to die having locked on Foo, and Thread-2 is waiting to lock on Foo.

(Technically speaking the current implementation does release locks, as it uses internally wait() while synchronized on Thread. However that's an internal mechanism not related to user code)


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

57.0k users

...