併發編程中,引入了對象互斥鎖的概念,來保證共享數據操做的完整性。共享對象對應一個可稱爲" 互斥鎖" 的標記,這個標記用來保證在任一時刻,只能有一個線程訪問該對象。java
共享鎖,容許多個線程共同訪問資源,又可稱爲讀鎖,容許併發查看數據的鎖。編程
讀寫鎖既是互斥鎖,又是共享鎖,其中讀操做共享,寫操做互斥。安全
同一時間只有一個線程能夠佔有寫鎖,同一時間多個線程能夠佔有讀鎖。併發
是互斥排他鎖,同一時間只能有一個線程在執行任務,ReentrantLock支持鎖的重入功能,雖然保證了線程的安全性,可是效率不高,實際上應該是寫操做互斥,讀操做共享。而jdk提供了讀寫鎖ReentrantReadWriteLock。this
public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializable { private static final long serialVersionUID = -6992448646407690164L; /** Inner class providing readlock */ private final ReentrantReadWriteLock.ReadLock readerLock; /** Inner class providing writelock */ private final ReentrantReadWriteLock.WriteLock writerLock; /** Performs all synchronization mechanics */ final Sync sync; /** * Creates a new {@code ReentrantReadWriteLock} with * default (nonfair) ordering properties. */ public ReentrantReadWriteLock() { this(false); } /** * Creates a new {@code ReentrantReadWriteLock} with * the given fairness policy. * * @param fair {@code true} if this lock should use a fair ordering policy */ public ReentrantReadWriteLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); readerLock = new ReadLock(this); writerLock = new WriteLock(this); } }
其中readerLock採用share模式,即爲共享鎖,而writerLock採用獨佔模式,2把鎖共享一個Sync對象。線程