ReentrantReadWriteLock读写锁

synchronized与Reentrantlock都为独占锁(排他锁),同一时间只允许一个线程执行同步代码块,可以保证线程的安全性,但是执行效率低。

ReentrantReadWriteLock读写锁为一种改进的排它锁,也可以称为共享锁。允许多个线程同时读取共享数据,但是一次只允许一个线程对共享数据进行更新。

通过读锁与写锁来完成读写操作。线程在读取共享数据前必须先持有读锁,该读锁可以同时被多个线程持有,也就是说读锁是共享的。写锁是排他的,线程在修改共享数据前必须持有写锁,但是写锁只允许一个线程持有,当有个线程持有写锁时,其他锁无法获得相应的锁。

读写分离

读锁只是在读线程之间共享,任何一个线程持有读锁时,其他线程都无法获得写锁,保证了线程在读取数据期间,没有其他线程对数据进行更新,保证了读线程能读到数据的最新值,保证在读取数据期间共享变量不被修改

获得条件 排他性 作用
读锁 写锁未被任何线程持有 对读线程是共享的,对写线程是排他的 允许多个读线程可以同时读取共享数据,保证在读共享数据时,没有其他线程对共享数据进行修改
写锁 该写锁未被其他线程持有,并且相应的读锁也未被其他线程持有 对读线程或写线程都是排他的 保证写线程以独占的方式修改共享数据

读写锁允许读读共享,读写互斥,写写互斥

 java.util.concurrent.locks    InterFace ReadWriteLock

接口中定了readLock() 返回读锁  定义了wireLock() 返回写锁

该接口实现类为ReentrantReadWriteLock

readLock() 返回读锁  定义了wireLock() 返回写锁  都返回为同一个锁的两个不同角色,不是分别获得两个不同的锁

ReadWriteLock接口的实例可以充当两个角色

ReadWriteLock lock = new ReentrantReadWriteLock();//定义读写锁

Lock readLock = lock.readLock();//获得读锁

Lock writeLock = lock.writeLock();//获得写锁
readLock .lock();//申请锁

try{        

        读取共享数据

}finally{

        readLock.unlock(); //总是在finally句子中释放锁

}
writeLock.lock()//申请锁

try{        

        修改共享数据

}finally{

        writeLock.unlock(); //总是在finally句子中释放锁

}

你可能感兴趣的:(java,开发语言)