读写锁顾名思义就是提供了一个读锁、一个写锁,其中读锁是共享锁,写锁是独占锁。
读锁同时可以有多个线程获取,获取的前提是没有其他线程的写锁(当然还有同时并发数限制,不过普通java进程也不会起那么多的线程);
写锁同时只能有一个线程获取,获取的前提是没有读锁和非本线程的写锁
ReentrantReadWriteLock 通过state字段的高低位分别控制读锁和写锁,低16位表示写锁,高16位表示读锁
读锁获取流程:
读锁释放流程:
写锁获取流程:
写锁释放流程:
注:
只有独占锁的线程可以重入,所以线程获得写锁之后可以继续重入;
而获得读锁之后接着去取写锁会被永远阻塞,读锁是共享的,而且没有记录所有共享的线程,上面的流程可以看出获取写锁的时候只要存在读锁,就会失败,所以线程不释放自己的读锁就永远获取不到写锁。
当然,获取读锁之后是可以再次获取读锁的,这也不算是重入,而是线程与自己共享。
新闻热点
疑难解答