当前位置:首页 > Java

java线程如何加锁

2026-03-20 22:37:10Java

使用 synchronized 关键字

synchronized 是 Java 中最基础的锁机制,可以修饰方法或代码块。修饰方法时,锁对象是当前实例(非静态方法)或类对象(静态方法);修饰代码块时,需显式指定锁对象。

修饰方法:

public synchronized void method() {
    // 同步代码
}

修饰代码块:

public void method() {
    synchronized (this) {  // 锁对象为当前实例
        // 同步代码
    }
}

使用 ReentrantLock

ReentrantLockjava.util.concurrent.locks 包下的显式锁,提供比 synchronized 更灵活的锁控制,支持公平锁、可中断锁等特性。

基本用法:

java线程如何加锁

private final ReentrantLock lock = new ReentrantLock();

public void method() {
    lock.lock();  // 加锁
    try {
        // 同步代码
    } finally {
        lock.unlock();  // 确保锁释放
    }
}

公平锁模式:

ReentrantLock fairLock = new ReentrantLock(true);  // true 表示公平锁

使用 ReadWriteLock

ReadWriteLock 通过分离读锁和写锁提高并发性能,适合读多写少的场景。

实现类 ReentrantReadWriteLock:

java线程如何加锁

private final ReadWriteLock 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();
    }
}

使用 StampedLock

StampedLock 是 Java 8 引入的乐观读锁机制,适合读操作远多于写操作的场景,性能优于 ReadWriteLock

乐观读示例:

private final StampedLock stampedLock = new StampedLock();

public double read() {
    long stamp = stampedLock.tryOptimisticRead();  // 获取乐观读戳
    double value = sharedValue;  // 读取共享数据
    if (!stampedLock.validate(stamp)) {  // 检查是否被写操作修改
        stamp = stampedLock.readLock();  // 升级为悲观读锁
        try {
            value = sharedValue;
        } finally {
            stampedLock.unlockRead(stamp);
        }
    }
    return value;
}

写锁示例:

public void write(double newValue) {
    long stamp = stampedLock.writeLock();
    try {
        sharedValue = newValue;
    } finally {
        stampedLock.unlockWrite(stamp);
    }
}

注意事项

  • 锁粒度:尽量缩小同步范围,避免不必要的性能损耗。
  • 死锁:避免嵌套获取多个锁,或使用 tryLock() 设置超时。
  • 资源释放:确保锁在 finally 块中释放,防止异常导致锁泄漏。
  • 性能权衡:根据场景选择锁类型,如高并发读优先考虑 ReadWriteLockStampedLock

标签: 线程加锁
分享给朋友:

相关文章

如何在java中实现线程

如何在java中实现线程

实现线程的两种主要方法 在Java中实现线程有两种主要方法:继承Thread类和实现Runnable接口。两种方法各有优缺点,适用于不同场景。 继承Thread类 通过继承Thread类并重写run…

js线程实现

js线程实现

JavaScript 线程实现方法 JavaScript 是单线程语言,但可以通过以下方式模拟多线程或实现并行处理: Web Workers Web Workers 允许在后台线程中运行脚本,不会影…

js 实现线程

js 实现线程

在JavaScript中实现类似线程的功能可以通过以下几种方法实现,尽管JavaScript本身是单线程的,但通过异步编程或Web Worker可以实现并行处理的效果。 使用Web Worker W…

如何在java中实现线程

如何在java中实现线程

实现线程的基本方法 在Java中实现线程主要有两种方式:继承Thread类和实现Runnable接口。 继承Thread类 通过继承Thread类并重写run()方法,可以定义一个线程任务。…

java 线程如何关闭

java 线程如何关闭

关闭 Java 线程的方法 Java 线程的关闭可以通过多种方式实现,以下是几种常见的方法: 使用标志位控制线程退出 通过设置一个布尔类型的标志位,线程在运行时检查该标志位,决定是否退出。这种方式安…

java 如何结束线程

java 如何结束线程

结束线程的方法 在Java中,线程的结束可以通过多种方式实现。以下是几种常用的方法: 使用标志位控制线程退出 定义一个volatile布尔变量作为标志位,线程在运行时检查该标志位,当标志位为fals…