请说明你对Java中读写锁(ReadWriteLock)的理解,包括其核心机制、典型实现以及适用场景。
考察说明
考查对Java并发包中读写锁机制、特性及适用场景的掌握程度。
回答思路
- 【回答框架 1】读写锁是一种同步机制,允许多个线程同时读共享资源,但写操作互斥且与读操作互斥,典型实现为ReentrantReadWriteLock,内部基于AQS的共享锁和独占锁实现。
- 【回答框架 2】读锁是共享锁,可被多个读线程同时持有;写锁是独占锁,同一时刻只能有一个写线程持有,且写锁优先级通常高于读锁,避免写线程饥饿。
- 【回答框架 3】读写锁适用于读多写少的场景,能显著提升并发性能,但不适合写频繁场景,因为写锁会阻塞所有读线程,此时性能反而下降。
- 【回答框架 4】ReentrantReadWriteLock还支持锁降级,即持有写锁时可以获取读锁,但不可升级,防止死锁;使用时需注意锁的持有时间,避免长时间占用导致阻塞。
- 【回答框架 5】选择读写锁时需权衡一致性要求,读写锁保证的是最终一致性,若需强一致性则需使用独占锁或额外同步机制。
- 【关键点 1】读写锁允许多个读线程并发访问,写线程独占访问。
- 【关键点 2】ReentrantReadWriteLock基于AQS实现共享锁和独占锁。
- 【关键点 3】读写锁适用于读多写少场景,写频繁时性能反而下降。
- 【关键点 4】支持锁降级但不支持锁升级,避免死锁风险。
- 【易错点 1】误认为读写锁适用于所有并发场景,写频繁时性能可能不如独占锁。
- 【易错点 2】忽略锁降级机制导致死锁或性能问题。
- 【易错点 3】未考虑公平性设置,可能导致写线程饥饿。