java函数如何加锁
加锁的基本方法
在Java中,可以通过synchronized关键字或java.util.concurrent.locks包中的锁机制实现函数加锁。
使用synchronized关键字
synchronized可以直接修饰方法或代码块,确保同一时间只有一个线程能执行被锁定的代码。
修饰实例方法:
public synchronized void synchronizedMethod() {
// 临界区代码
}
锁对象是当前实例(this),同一实例的多个线程会互斥访问。
修饰静态方法:
public static synchronized void staticSynchronizedMethod() {
// 临界区代码
}
锁对象是类的Class对象,所有实例的线程都会互斥访问。
同步代码块:
public void methodWithBlock() {
synchronized (lockObject) {
// 临界区代码
}
}
需显式指定锁对象(lockObject),可以是任意对象实例。
使用ReentrantLock
java.util.concurrent.locks.ReentrantLock提供更灵活的锁控制,支持公平锁、可中断锁等特性。
import java.util.concurrent.locks.ReentrantLock;
private final ReentrantLock lock = new ReentrantLock();
public void lockMethod() {
lock.lock(); // 获取锁
try {
// 临界区代码
} finally {
lock.unlock(); // 确保锁释放
}
}
特点:

- 可重入:同一线程可重复获取锁。
- 支持公平性:通过构造函数设置
fair参数。 - 可中断:
lockInterruptibly()方法允许中断等待。
锁的选择建议
- 简单场景:优先使用
synchronized,语法简洁且自动释放锁。 - 复杂需求:需要超时、公平性等功能时,选择
ReentrantLock。 - 高并发:考虑
ReadWriteLock(读写锁)分离读/写操作。
注意事项
- 避免锁嵌套,防止死锁。
- 锁范围应尽量小,减少性能影响。
- 确保锁最终被释放(如
finally块中解锁)。






