在 Java 中,多线程的锁机制主要用于保证共享资源的线程安全。下面从常见锁类型 → 使用示例 → 使用建议系统讲一下。
synchronized(内置锁 / 隐式锁)最基础、最常用的锁。
public synchronized void add() {
count++;
}
private final Object lock = new Object();
public void add() {
synchronized (lock) {
count++;
}
}
✅ 特点:
ReentrantLock(显示锁)java.util.concurrent.locks 提供
ReentrantLock lock = new ReentrantLock();
public void add() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
✅ 特点:
tryLock)ReadWriteLock(读写锁)适合读多写少场景
ReadWriteLock rwLock = new ReentrantReadWriteLock();
public void read() {
rwLock.readLock().lock();
try {
// 读操作
} finally {
rwLock.readLock().unlock();
}
}
public void write() {
rwLock.writeLock().lock();
try {
// 写操作
} finally {
rwLock.writeLock().unlock();
}
}
StampedLock(乐观读锁,JDK 8+)性能更高,适合高并发读
StampedLock lock = new StampedLock();
long stamp = lock.tryOptimisticRead();
// 读
if (!lock.validate(stamp)) {
stamp = lock.readLock();
try {
// 重新读
} finally {
lock.unlockRead(stamp);
}
}
volatile(不是锁,但常配合用)保证可见性,不保证原子性
private volatile boolean flag = false;
class Counter {
private int count = 0;
private final Object lock = new Object();
public void increment() {
synchronized (lock) {
count++;
}
}
public int getCount() {
return count;
}
}
✅ 锁的粒度尽量小
synchronized(lock) {
// 只包必要代码
}
✅ 锁对象必须是 final
private final Object lock = new Object();
✅ 避免在锁中调用外部方法 防止死锁
✅ 优先用并发工具类
AtomicIntegerConcurrentHashMapCountDownLatchsynchronized(a) {
synchronized(b) {
}
}
✅ 解决:
tryLock| 锁 | 是否显示 | 适用场景 |
|---|---|---|
| synchronized | 否 | 简单同步 |
| ReentrantLock | 是 | 高级控制 |
| ReadWriteLock | 是 | 读多写少 |
| StampedLock | 是 | 高并发读 |
如果你愿意,我可以:
你更想深入哪一块?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。