共享锁 & 排他锁 & 读写锁

互斥锁(排他锁)

并发编程中,引入了对象互斥锁的概念,来保证共享数据操做的完整性。共享对象对应一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。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对象。线程

相关文章
相关标签/搜索