跟着作者的65节课彻底搞懂Java并发原理专栏,一步步彻底搞懂Java并发原理。
作者简介:笔名seaboat,擅长工程算法、人工智能算法、自然语言处理、架构、分布式、高并发、大数据和搜索引擎等方面的技术,大多数编程语言都会使用,但更擅长Java、Python和C++。平时喜欢看书、写作和运动,擅长篮球、跑步、游泳、健身和羽毛球等运动项目。崇尚开源,崇尚技术自由,更崇尚思想自由。出版书籍:《Tomcat内核设计剖析》、《图解数据结构与算法》、《人工智能原理科普》。
关于读写锁
前面的章节中我们分析了Java语法层面的synchronized锁和JDK内置可重入锁ReentrantLock,我们在多线程并发场景中可以通过它们来控制对资源的访问从而达到线程安全。这两种锁都属于纯粹的独占锁,也就是说这些锁任意时刻只能由一个线程持有,其它线程都得排队依次获取锁。
有些场景下为了提高并发性能我们会对纯粹的独占锁进行改造,额外引入共享锁来与独占锁共同对外构成一个锁,这种就叫读写锁。为什么叫读写锁呢?主要是因为它的使用考虑了读写场景,一般认为读操作不会改变数据所以可以多线程进行读操作,但写操作会改变数据所以只能一个线程进行写操作。读写锁在内部维护了一对锁(读锁和写锁),它通过将锁进行分离从而得到更高的并发性能。
如下图中,存在一个读写锁对象,其内部包含了读锁和写锁两个对象。假如存在五个线程,其中线程一和线程二想要获取读锁,那么两个线程是可以同时获取到读锁的。但是写锁就不可以共享,它是独占锁。比如线程三、线程四和线程五都想要持有写锁,那么只能一个个线程轮