|
发表于 2025-3-18 23:32:44
|
显示全部楼层
在Java中,锁(Lock)是并发编程中用于控制多个线程对共享资源访问的机制。Java提供了多种锁机制,主要包括以下几类:
1. Synchronized 关键字(内置锁)
Java最基本的锁机制是 synchronized,它是基于JVM的内置锁(Monitor Lock)。
特点:
- 互斥性:同一时刻只有一个线程可以获取锁。
- 可重入性:同一线程可以多次获取同一把锁。
- 自动释放:线程执行完同步代码块后自动释放锁。
示例:
[code=java]
public class SynchronizedExample {
private int count = 0;
public synchronized void increment() {
count++;
}
public void decrement() {
synchronized (this) {
count--;
}
}
}
[/code]
2. ReentrantLock(可重入锁)
ReentrantLock 是 java.util.concurrent.locks 包提供的显式锁,相比 synchronized,它提供了更灵活的锁机制。
特点:
- 可重入性:同一线程可以多次获取同一把锁。
- 可中断性:支持 lockInterruptibly() 方法,允许线程在等待锁时被中断。
- 超时获取:支持 tryLock() 方法,可以尝试获取锁并设置超时时间。
- 公平锁/非公平锁:默认是非公平锁,可以通过构造方法指定为公平锁。
示例:
[code=java]
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockExample {
private final ReentrantLock lock = new ReentrantLock();
private int count = 0;
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
}
[/code]
3. ReadWriteLock(读写锁)
ReadWriteLock 允许多个线程同时读取,但写操作是互斥的。
特点:
- 读锁(ReadLock):多个线程可以同时获取读锁。
- 写锁(WriteLock):同一时刻只有一个线程可以获取写锁。
- 读写互斥:写锁会阻塞读锁,写锁之间也互斥。
示例:
[code=java]
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReadWriteLockExample {
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private int data = 0;
public int read() {
lock.readLock().lock();
try {
return data;
} finally {
lock.readLock().unlock();
}
}
public void write(int value) {
lock.writeLock().lock();
try {
data = value;
} finally {
lock.writeLock().unlock();
}
}
}
[/code]
4. StampedLock(改进的读写锁)
StampedLock 是 Java 8 引入的锁,类似于 ReadWriteLock,但提供了乐观读锁,提高了并发性能。
特点:
- 乐观读锁:获取读锁时不会阻塞写操作,提高性能。
- 悲观读锁:类似于 ReadWriteLock 的读锁。
- 写锁:与 ReadWriteLock 的写锁类似。
示例:
[code=java]
import java.util.concurrent.locks.StampedLock;
public class StampedLockExample {
private final StampedLock lock = new StampedLock();
private int data = 0;
public int read() {
long stamp = lock.tryOptimisticRead();
int result = data;
if (!lock.validate(stamp)) {
stamp = lock.readLock();
try {
result = data;
} finally {
lock.unlockRead(stamp);
}
}
return result;
}
public void write(int value) {
long stamp = lock.writeLock();
try {
data = value;
} finally {
lock.unlockWrite(stamp);
}
}
}
[/code]
5. 其他锁机制
- Semaphore(信号量):用于控制同时访问资源的线程数量。
- CountDownLatch(倒计时锁):用于等待多个线程完成任务。
- CyclicBarrier(循环屏障):让多个线程在某个点上等待,直到所有线程都到达。
- LockSupport(低级锁机制):提供更底层的线程阻塞和唤醒机制。
总结
Java 提供了多种锁机制,从 synchronized 到 ReentrantLock、ReadWriteLock、StampedLock,每种锁都有其适用场景。选择合适的锁可以提高程序的并发性能,减少线程竞争,提高吞吐量。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|