Java中的锁分类总结
请汇总Java中各种锁的分类及其典型代表。
回答
我还是少年
1. 乐观锁 vs 悲观锁
- 悲观锁:假设并发冲突发生,加锁同步(synchronized、ReentrantLock)。
- 乐观锁:假设无冲突,先操作后验证(CAS、AtomicInteger、StampedLock乐观读)。
2. 公平锁 vs 非公平锁
- 公平锁:先来先服务(ReentrantLock(true))。
- 非公平锁:允许插队,吞吐量更高(synchronized、ReentrantLock(false)默认)。
3. 可重入锁 vs 不可重入锁
- 可重入锁:同一线程可重复获取同一锁(synchronized、ReentrantLock)。
- 不可重入锁:同一线程不可重复获取(StampedLock)。
4. 共享锁 vs 排他锁
- 排他锁(互斥锁):一次只能一个线程持有(synchronized、ReentrantLock写模式)。
- 共享锁:多个线程可同时持有(ReentrantReadWriteLock读锁、Semaphore)。
5. 分段锁
- ConcurrentHashMap JDK7:对Segment加锁,一个Segment管理多个桶。
6. 自旋锁
- 通过CAS循环等待,不挂起线程(JUC中通过Unsafe+循环实现)。
选择建议:根据并发强度、资源冲突概率和性能要求选择合适的锁。