Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这个函数永远不会终止?_Java_Multithreading_Deadlock - Fatal编程技术网

Java 为什么这个函数永远不会终止?

Java 为什么这个函数永远不会终止?,java,multithreading,deadlock,Java,Multithreading,Deadlock,为什么下面的函数会死锁?换句话说,为什么它不仅阻止任何人获得写锁,而且阻止任何人获得读锁?无法共享读取锁吗 void testReadWriteLock() throws InterruptedException { final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); // Other thread acquires read lock and never releases

为什么下面的函数会死锁?换句话说,为什么它不仅阻止任何人获得写锁,而且阻止任何人获得读锁?无法共享读取锁吗

    void testReadWriteLock() throws InterruptedException {
        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

        // Other thread acquires read lock and never releases it.
        new Thread(() -> lock.readLock().lock()).start();
        Thread.sleep(100);

        // Other thread attempts (and fails) to acquire write lock.
        new Thread(() -> lock.writeLock().lock()).start();
        Thread.sleep(100);

        lock.readLock().lock(); // This blocks forever
    }

我发现了
ReentrantReadWriteLock
的一个有趣特性:任何获取写锁的尝试(甚至是阻塞)都会阻止所有后续获取读锁的尝试(除了重新进入的尝试)。至少,Oracle的1.8 JVM就是这样。对写入进行优先级排序有一定的逻辑:它确保数据是最新的。

您可以让多个线程获得读锁,但当获得写锁时,其他所有线程都被阻止。由于您从未解锁任何东西,因此该方法中的最后一次锁调用将永远不会获得锁。

“其他线程尝试(但失败)获取写锁”是失败,还是仅阻止等待获取锁?