ReentrantReadWriteLock读写锁详解
- 2017-02-28 22:34:00
- admin
- 原创 1737
一、ReentrantReadWriteLock读写锁详解
函数说明:
1、Lock readLock(),获取读锁,读写锁内部的一个成员;
2、Lock writeLock(),获取写锁,读写锁内部的一个成员;
3、int getReadLockCount(),读锁总重入量;
4、int getReadHoldCount(),当前线程读锁重入量;
5、int getWriteHoldCount(),当前线程写锁重入量;
6、Thread getOwner(),写锁持有的线程;
使用详解:
1、使用变量state保存重入量,低16位保存写锁重入量,高16位保存读锁重入量;
2、读锁和写锁总重入量保存在state变量,单个线程读锁重入量保存在线程局部变量;
3、写锁允许写锁和读锁重入,读锁只允许读锁重入;
4、写锁允许降级为读锁,线程获取写锁后,继续获取读锁,然后释放写锁;
5、公平锁策略,如果队列中有线程在等待,读锁和写锁都会加入等待锁队列;
6、非公平锁策略,如果队列头部是写锁在等待,只有读锁会加入等待锁队列,保证写锁不会等太久;
7、读锁不支持newCondition操作,写锁支持newCondition操作;
写锁允许读锁重入代码示例:
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
Lock writeLock = lock.writeLock();
Lock readLock = lock.readLock();
writeLock.lock();
System.out.println("in write lock");
readLock.lock();
System.out.println("in read lock");
readLock.unlock();
writeLock.unlock();
写锁降级为读锁代码示例:
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
Lock writeLock = lock.writeLock();
Lock readLock = lock.readLock();
writeLock.lock();
System.out.println("in write lock");
readLock.lock();
writeLock.unlock();
System.out.println("in read lock");
readLock.unlock();