读写锁和互斥锁类似,但是读写锁允许更高的并行性。互斥锁要么是锁住状态,要么是不加锁状态,而且一次只有一个线程可以对其加锁。考虑这样一种场景,多个线程对一个文件进行读写操作,线程操作前先加锁,通常对文件的只读操作不会改变文件的状态,因此可以允许多个线程同时读取文件。如果使用互斥锁是做不到这一点的,这时候读写锁就上场了。读写锁就是用来解决这个问题的,读操作可以共享,写操作是排他的,可以有多个线程同时在读,但同一时间只能有一个线程写,同时线程写的时候不允许其它线程读。
读写锁可以有三种状态:读模式加锁状态,写模式加锁状态,不加锁状态。一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁。
当读写锁是写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞。
当读写锁是读加锁状态时,所有试图以读模式对它进行加锁的线程都可以得到访问权;但是任何试图以写模式对它进行加锁的线程也都会被阻塞,直到所有的读线程都释放读锁为止。
但是考虑这样一种场景,几个读线程以读模式占有读写锁,这时候写线程希望以写模式加锁因此陷入休眠,但是如果一直不断有新的读线程加锁的话,一种可能就是写线程将永远得不到锁。
为了解决这个问题,当读写锁处于读模式加锁状态,当有线程试图以写模式加锁之后读写锁通常会阻塞新的读模式加锁请求,这样就可以避免读模式锁长期占用而等待的写模式锁请求一直得不到满足。