Simple
java.util.concurrent.lock.ReadWriteLock implementation that uses a semaphore that grants up to
java.lang.Integer.MAX_VALUE permits using a fair FIFO policy.
A read lock requires 1 permit, while a write lock requires all the permits.
author: Paul Ferraro