ReadWriteLock(讀寫鎖),該接口只定義兩個方法
Lock readLock();
Lock writeLock();
一個用來獲取讀鎖,一個用來獲取寫鎖。也就是說將文件的讀寫操作分開,分成2個鎖來分配給線程,從而使得多個線程可以同時進行讀操作。
ReentrantReadWriteLock
ReentrantReadWriteLock實現了ReadWriteLock接口。相比于ReentrantLock是一個排他鎖,同一時間只允許一個線程訪問,而ReentrantReadWriteLock允許多個讀線程同時訪問,但不允許寫線程和讀線程、寫線程和寫線程同時訪問。相對于排他鎖,提高了并發性。在實際應用中,大部分情況下對共享數據(如緩存)的訪問都是讀操作遠多于寫操作,這時ReentrantReadWriteLock能夠提供比排他鎖更好的并發性和吞吐量。
StampedLock
StampedLock是Java8引入的一種新的所機制,簡單的理解,可以認為它是讀寫鎖的一個改進版本,讀寫鎖雖然分離了讀和寫的功能,使得讀與讀之間可以完全并發,但是讀和寫之間依然是沖突的,讀鎖會完全阻塞寫鎖,它使用的依然是悲觀的鎖策略,如果有大量的讀線程,他也有可能引起寫線程的饑餓。而StampedLock則提供了一種樂觀的讀策略,這種樂觀策略的鎖非常類似于無鎖的操作,使得樂觀鎖完全不會阻塞寫線程。