为什么ReentrantLock无法获得锁定

时间:2018-01-18 09:22:22

标签: java multithreading

我有一个简单的程序来测试条件如下:

public class ThreadTest2 {
    Lock lock = new ReentrantLock();
    Condition condition = lock.newCondition();

    public void conditionWait() throws InterruptedException {
        lock.lock();
        try {
            System.out.println("1");
            condition.await();
            System.out.println("2");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public void conditionSignal() throws InterruptedException {
        lock.lock();
        try {
            System.out.println("3");
            condition.signal();
            System.out.println("4");
        } finally {
            lock.unlock();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        ThreadTest2 test = new ThreadTest2();

        test.conditionWait();

        Thread.sleep(2000);

        test.conditionSignal();
    }
}

结果是:1, 似乎conditionWait()方法已经采取了锁定,因此conditionSignal()方法无法获取它。然而,如果我改变程序以在每个方法中使用线程:

public class ThreadTest2 {
    Lock lock = new ReentrantLock();
    Condition condition = lock.newCondition();

    public void conditionWait() throws InterruptedException {
        new Thread() {
            public void run() {
                lock.lock();
                try {
                    System.out.println("1");
                    condition.await();
                    System.out.println("2");
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }finally {
                    lock.unlock();
                }
            };
        }.start();
    }

    public void conditionSignal() throws InterruptedException{
        new Thread() {
            public void run() {
                lock.lock();
                try {
                    System.out.println("3");
                    condition.signal();
                    System.out.println("4");
                } finally {
                    lock.unlock();
                }
            };
        }.start();
    }

    public static void main(String[] args) throws InterruptedException {
        ThreadTest2 test = new ThreadTest2();

        test.conditionWait();

        Thread.sleep(2000);

        test.conditionSignal();
    }
}

结果是:1 3 4 2,那么它们之间有什么区别,为什么使用线程可以得到锁,而没有线程不能

1 个答案:

答案 0 :(得分:1)

conditionWait中,您可以使用锁定,等待获取该条件。这确实会暂时释放锁,但它仍然可能永远等待

wait完成的唯一方法是发出信号。如果你在等待,信号会从哪里来?仅来自另一个帖子。但是没有其他线程所以这将永远等待。