ReentrantReadWriteLock

41 阅读1分钟

锁的演进

  • 无锁:多线程抢夺,数据乱,无序
  • 独占锁ReentrantLock:有序,每次只能有一个读或写操作,全部互斥
  • 读写锁ReentrantReadWriteLock:读写互斥,读读共享

缺点:锁饥饿,写线程得不到锁;读的过程中,锁不释放,写线程不可以获得锁

  • 邮戳锁StampedLock

读写锁

是什么

一个资源能够被多个读线程访问,或者被一个写线程访问,但是不能同时存在读写线程。读写互斥,读读共享

特点

读写锁ReentrantReadWriteLock并不是真正意义上的读写分离,它只允许读读共存,而读写和写写依然是互斥的,大多实际场景是“读/读”线程间并不存在互斥关系,只有"读/写"线程或"写/写"线程间的操作需要互斥的。因此引入ReentrantReadWriteLock。一个ReentrantReadWriteLock同时只能存在一个写锁但是可以存在多个读锁,但不能同时存在写锁和读锁。也即一个资源可以被多个读操作访问或一个写操作访问,但两者不能同时进行。只有在读多写少情境之下,读写锁才具有较高的性能体现。

ReentrantReadWriteLock降级

锁降级是为了让当前线程感知到数据的变化,目的是保证数据可见性。如果有线程在读,那么写线程是无法获取写锁的,是悲观锁的策略