java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java有哪些锁

一文详细讲解Java中有哪些锁

作者:xzkyd outpaper

在Java编程中锁是一种同步机制,用于确保多个线程在访问共享资源时的一致性和正确性,这篇文章主要介绍了Java中有哪些锁的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

1. synchronized 锁

作用
synchronized 是 Java 最基础的锁机制,用于实现方法或代码块的同步,保证多线程环境下的原子性、可见性和有序性。

使用方式

特点

适用场景
简单同步需求,如单例模式的双重检查锁。

2. ReentrantLock(可重入锁)

作用
ReentrantLock 是 java.util.concurrent.locks 包下的显式锁,提供比 synchronized 更灵活的锁控制。

使用方式

ReentrantLock lock = new ReentrantLock();
public void method() {
    lock.lock(); // 手动加锁
    try {
        // 临界区代码
    } finally {
        lock.unlock(); // 必须手动释放
    }
}

核心功能

优缺点

适用场景
需要复杂同步控制的场景,如多条件等待、锁超时处理。

3. ReadWriteLock(读写锁)

作用

允许多个线程同时读,但写线程独占资源,适用于读多写少的场景。

实现类ReentrantReadWriteLock

使用方式

ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
ReentrantReadWriteLock.ReadLock readLock = rwLock.readLock();
ReentrantReadWriteLock.WriteLock writeLock = rwLock.writeLock();

public void readData() {
    readLock.lock();
    try { ... } finally { readLock.unlock(); }
}

public void writeData() {
    writeLock.lock();
    try { ... } finally { writeLock.unlock(); }
}

特点

适用场景
缓存系统、频繁读取但偶尔更新的数据结构。

4. StampedLock(Java 8+)

作用

提供更灵活的读写锁控制,支持乐观读、悲观读、写锁三种模式,性能优于 ReadWriteLock

使用方式

StampedLock stampedLock = new StampedLock();

// 乐观读(无锁)
long stamp = stampedLock.tryOptimisticRead();
if (!stampedLock.validate(stamp)) { // 检查是否发生写操作
    stamp = stampedLock.readLock(); // 退化为悲观读
    try { ... } finally { stampedLock.unlockRead(stamp); }
}

// 写锁
long writeStamp = stampedLock.writeLock();
try { ... } finally { stampedLock.unlockWrite(writeStamp); }

特点

适用场景
读多写少且对性能要求极高的场景,但需谨慎处理锁转换逻辑。

5. 显式锁 vs 隐式锁

维度显式锁(如 ReentrantLock)隐式锁(synchronized)
锁获取方式手动调用 lock() 和 unlock()自动获取和释放
灵活性支持超时、中断、公平锁、条件变量仅支持非公平锁,无超时或中断机制
性能高并发场景下更优优化后性能接近显式锁(如锁升级机制)
代码复杂度需手动管理,易出错自动管理,代码简洁

6. 锁优化策略(JVM 对 synchronized 的优化)

锁升级流程

无锁 → 偏向锁 → 轻量级锁 → 重量级锁

7. 条件锁(Condition)

作用
配合显式锁(如 ReentrantLock)使用,实现线程的等待/唤醒机制,类似 Object.wait() 和 Object.notify(),但更灵活。

使用方式

ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();

public void await() throws InterruptedException {
    lock.lock();
    try {
        condition.await(); // 释放锁并等待
    } finally { lock.unlock(); }
}

public void signal() {
    lock.lock();
    try {
        condition.signal(); // 唤醒一个等待线程
    } finally { lock.unlock(); }
}

适用场景
生产者-消费者模型、多条件线程协调。

8. 分布式锁

作用

在分布式系统中协调多节点对共享资源的访问,防止并发冲突。

实现方式

核心挑战

总结

锁类型核心特点适用场景
synchronized简单、自动管理,支持锁升级优化简单同步需求
ReentrantLock灵活,支持超时、公平锁、条件变量复杂同步控制(如多条件等待)
ReadWriteLock读写分离,读多写少场景性能更优缓存、频繁读的数据结构
StampedLock高性能,支持乐观读极高并发读场景
分布式锁跨进程、跨节点协调分布式系统资源共享

选择建议

到此这篇关于Java中有哪些锁的文章就介绍到这了,更多相关Java有哪些锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文