The method getQueuedReaderThreads() returns the set of threads waiting to read. why should they wait to READ? Its fair to wait to WRITE.
The obvious case is... the reader must wait to get the lock, if a writer owns the lock. Has nothing to do with fairness, as the reader wants the data in a state that is valid.
The less obvious case is... the reader must wait to get the lock, if there is a writer waiting to get the lock earlier in the queue. This has everything to do with fairness. If the readers can get the lock any time another reader owns the lock, they can play tag with each other, effectively starving out the writers.
The algorithm is a bit more complex than that, but that is basically the jist of it.