java如何实现加锁
Java 加锁的实现方式
Java 提供了多种加锁机制,包括内置的 synchronized 关键字、ReentrantLock 类以及 ReadWriteLock 接口等。以下是几种常见的实现方式:
使用 synchronized 关键字
synchronized 是 Java 中最基本的加锁方式,可以用于方法或代码块。
同步方法:
public synchronized void synchronizedMethod() {
// 临界区代码
}
同步代码块:
public void method() {
synchronized (this) {
// 临界区代码
}
}
使用 ReentrantLock
ReentrantLock 是 java.util.concurrent.locks 包中的一个类,提供了比 synchronized 更灵活的加锁机制。
import java.util.concurrent.locks.ReentrantLock;
public class LockExample {
private final ReentrantLock lock = new ReentrantLock();
public void method() {
lock.lock();
try {
// 临界区代码
} finally {
lock.unlock();
}
}
}
使用 ReadWriteLock
ReadWriteLock 允许多个线程同时读取数据,但写入时独占锁,适用于读多写少的场景。
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReadWriteLockExample {
private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
public void readMethod() {
rwLock.readLock().lock();
try {
// 读取操作
} finally {
rwLock.readLock().unlock();
}
}
public void writeMethod() {
rwLock.writeLock().lock();
try {
// 写入操作
} finally {
rwLock.writeLock().unlock();
}
}
}
使用 StampedLock
StampedLock 是 Java 8 引入的一种更高效的锁机制,支持乐观读锁。

import java.util.concurrent.locks.StampedLock;
public class StampedLockExample {
private final StampedLock lock = new StampedLock();
public void readMethod() {
long stamp = lock.tryOptimisticRead();
// 读取操作
if (!lock.validate(stamp)) {
stamp = lock.readLock();
try {
// 重新读取操作
} finally {
lock.unlockRead(stamp);
}
}
}
public void writeMethod() {
long stamp = lock.writeLock();
try {
// 写入操作
} finally {
lock.unlockWrite(stamp);
}
}
}
加锁的最佳实践
- 避免死锁:确保锁的获取顺序一致,避免循环等待。
- 减少锁的粒度:尽量缩小锁的范围,减少锁的持有时间。
- 使用适当的锁类型:根据场景选择
synchronized、ReentrantLock或ReadWriteLock。 - 释放锁:确保在
finally块中释放锁,防止异常导致锁未释放。
通过以上方法,可以根据具体需求选择合适的加锁机制来实现线程安全。






