ReadWriteLock成为读写锁,事java并发包下的一个类,该锁包括读锁和写锁。其中读锁之间采用共享式获取锁资源,读线程之间互不影响;如果有线程获取了读锁,那么写锁则会获取失败;如果有线程获取了写锁,则读锁获取失败(非同一线程),写锁是可重入锁,也是独占锁。读写锁的共享资源是4个字节的int类型,高16位表示读锁数;低16位表示写锁次数。
00000000 00000000 00000000 00000000
c:=0 读写锁都没有 w:=0 读锁没有 r:=写锁没有
00000000 00000001 00000000 00000000
c:!=0 读锁为1 写锁没有
00000000 00000000 00000000 00000001
c:!=0 写锁不为0
读写锁不支持锁升级,像:
r.lock()
// do something
w.lock()
// do ...
w.unlock()
// ...
r.unlock()
比如:线程1获取了读锁,当执行到要获取写锁的代码时,线程2获取了读锁,此时线程1想获取写锁就会失败;同样线程2继续执行,想获取写锁的时候,线程1因为获取了读锁,线程2获取写锁失败,则等待。
读写锁支持锁降级,像
w.lock()
// do ...
r.lock()
// do ...
r.unlock()
// do ...
w.unlock()
// do ...
线程1获取了写锁,在要获取读锁之前,线程2尝试获取写锁失败,等线程1获取了读锁,执行完释放读锁,再释放写锁,线程2就可以获取锁资源了,这样线程1的修改内容对线程2是可见的,避免了脏读出现。