In che casi è preferibile utilizzare ReentrantReadWriteLock piuttosto che un semplice ReentrantLock?

E quali sono le differenze tra i due Lock?