java如何使用锁
锁的基本概念
在Java中,锁用于控制多线程对共享资源的访问,避免数据竞争和不一致性。常用的锁机制包括synchronized关键字和java.util.concurrent.locks包中的显式锁(如ReentrantLock)。
使用synchronized关键字
synchronized是Java内置的锁机制,可以修饰方法或代码块。
修饰实例方法
锁对象是当前实例(this),同一实例的多个线程会互斥访问。
public synchronized void method() {
// 临界区代码
}
修饰静态方法
锁对象是类的Class对象,所有实例的线程会互斥访问。

public static synchronized void staticMethod() {
// 临界区代码
}
修饰代码块
需指定锁对象(可以是任意对象),灵活性更高。
public void blockMethod() {
synchronized (lockObject) {
// 临界区代码
}
}
使用ReentrantLock
ReentrantLock是显式锁,提供了比synchronized更灵活的功能,如可中断、公平锁等。
基本用法

private final ReentrantLock lock = new ReentrantLock();
public void lockMethod() {
lock.lock(); // 获取锁
try {
// 临界区代码
} finally {
lock.unlock(); // 确保释放锁
}
}
尝试获取锁
通过tryLock()避免线程阻塞。
if (lock.tryLock(1, TimeUnit.SECONDS)) {
try {
// 临界区代码
} finally {
lock.unlock();
}
} else {
// 处理获取锁失败的情况
}
公平锁
通过构造函数指定公平性,减少线程饥饿。
ReentrantLock fairLock = new ReentrantLock(true); // 公平锁
读写锁(ReentrantReadWriteLock)
适用于读多写少的场景,允许多个读线程同时访问,写线程独占。
private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
public void readData() {
rwLock.readLock().lock();
try {
// 读操作
} finally {
rwLock.readLock().unlock();
}
}
public void writeData() {
rwLock.writeLock().lock();
try {
// 写操作
} finally {
rwLock.writeLock().unlock();
}
}
锁的注意事项
- 避免死锁:确保锁的获取和释放成对出现,避免嵌套锁的不同顺序。
- 性能影响:锁的粒度应尽量小,减少临界区代码的执行时间。
- 锁的选择:高并发读场景优先考虑读写锁,复杂场景使用
ReentrantLock。
通过合理选择锁机制,可以有效保证线程安全性和程序性能。






