This happens when threads were interrupted elsewhere while acquiring read lock of a org.logicalcobwebs.concurrent.WriterPreferenceReadWriteLock instance(or attempt method as well, not tested).
This is caused by code of line 167 and 177:
167 if (Thread.interrupted()) throw new InterruptedException();
177 cancelledWaitingReader();
The method acquire() will break out when a InterruptedException is dectected or current thread is previously interrupted without increasing the counter of activeReaders_, but finally, the method release() of the read lock will always be invoked, and endRead() method is invoked, which will decrease the counter of activeReaders_. After several times of interruption, the counter of activeReaders_ will get a negative value, and then threads waiting for the writer lock will never be notified.
A test case is submitted in the attachment.
Test case of deadlock of WriterPreferenceReadWriteLock