Java中的锁
Java中的锁
- Java中的锁主要用于实现线程同步,确保多个线程在访问共享资源时不会发生冲突。Java提供了多种锁机制,比如
synchronized关键字、ReentrantLock、ReadWriteLock和StampedLock等。这些锁机制各有特点,适用于不同的场景。
1. synchronized
synchronized是Java关键字,由JVM实现- 特性:可重入、自动释放、非公平锁
- 优势:代码简洁,低竞争时性能优异
2. ReentrantLock
ReentrantLock是java.util.concurrent.locks包中的类,基于AQS(AbstractQueuedSynchronizer)实现- 特性:可重入、手动释放(
finally中unlock())、提供限时等待、支持公平/非公平锁 - 优势:高竞争场景(非公平模式)性能略优(减少线程切换)
3. ReadWriteLock
ReadWriteLock接口允许多个读线程同时访问共享资源,但写线程独占访问- 特性:读锁共享,写锁互斥
- 优势:读操作并发高,写操作互斥保持数据一致性
4. StampedLock
StampedLock是Java 8引入的锁,优化了读写锁的性能- 特性:支持乐观读锁(无锁读取,验证版本号,冲突时降级为读锁),三种模式(读、写、乐观)
- 优势:乐观锁的性能远远优于读写锁(无锁竞争),适合用于极低写频率场景(如统计系统)
