共享鎖 & 排他鎖 & 讀寫鎖

互斥鎖(排他鎖)

併發編程中,引入了對象互斥鎖的概念,來保證共享數據操做的完整性。共享對象對應一個可稱爲" 互斥鎖" 的標記,這個標記用來保證在任一時刻,只能有一個線程訪問該對象。java

共享鎖

共享鎖,容許多個線程共同訪問資源,又可稱爲讀鎖,容許併發查看數據的鎖。編程

讀寫鎖

讀寫鎖既是互斥鎖,又是共享鎖,其中讀操做共享,寫操做互斥。安全

同一時間只有一個線程能夠佔有寫鎖,同一時間多個線程能夠佔有讀鎖。併發

ReentrantReadWriteLock

是互斥排他鎖,同一時間只能有一個線程在執行任務,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對象。線程

相關文章
相關標籤/搜索