java如何加锁解锁
Java 加锁与解锁的方法
synchronized 关键字
使用 synchronized 关键字可以对代码块或方法进行加锁和解锁操作。锁的获取和释放由 JVM 自动管理。
// 同步方法
public synchronized void synchronizedMethod() {
// 临界区代码
}
// 同步代码块
public void someMethod() {
synchronized (this) {
// 临界区代码
}
}
ReentrantLock 类
ReentrantLock 是 java.util.concurrent.locks 包中的显式锁实现,需要手动加锁和解锁。
import java.util.concurrent.locks.ReentrantLock;
private final ReentrantLock lock = new ReentrantLock();
public void lockMethod() {
lock.lock(); // 加锁
try {
// 临界区代码
} finally {
lock.unlock(); // 解锁
}
}
ReadWriteLock 接口
ReadWriteLock 提供读写分离的锁机制,适用于读多写少的场景。
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
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(); // 解写锁
}
}
Lock 接口的 tryLock 方法
tryLock 尝试获取锁,如果锁不可用则立即返回,避免线程阻塞。
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
private final Lock lock = new ReentrantLock();
public void tryLockMethod() {
if (lock.tryLock()) {
try {
// 临界区代码
} finally {
lock.unlock();
}
} else {
// 锁不可用时的处理逻辑
}
}
锁的公平性
ReentrantLock 和 ReentrantReadWriteLock 支持公平锁和非公平锁。公平锁按照请求顺序分配锁,非公平锁允许插队。

// 公平锁
private final ReentrantLock fairLock = new ReentrantLock(true);
// 非公平锁(默认)
private final ReentrantLock unfairLock = new ReentrantLock();
锁的注意事项
- 确保在
finally块中释放锁,避免锁泄漏。 - 避免嵌套加锁,防止死锁。
- 使用读写锁优化读多写少的场景。





