当前位置:首页 > Java

java如何实现锁

2026-03-03 12:16:21Java

Java 锁的实现方式

Java 提供了多种锁机制,用于控制多线程对共享资源的访问。以下是常见的锁实现方式:

synchronized 关键字

synchronized 是 Java 中最基本的锁机制,可以用于方法或代码块。它基于对象监视器(monitor)实现,确保同一时间只有一个线程可以执行被锁定的代码。

方法锁示例:

public synchronized void method() {
    // 临界区代码
}

代码块锁示例:

public void method() {
    synchronized(this) {
        // 临界区代码
    }
}

ReentrantLock

ReentrantLockjava.util.concurrent.locks 包中的一个可重入锁实现,提供了比 synchronized 更灵活的锁操作。

基本用法:

private final ReentrantLock lock = new ReentrantLock();

public void method() {
    lock.lock();
    try {
        // 临界区代码
    } finally {
        lock.unlock();
    }
}

公平锁与非公平锁:

// 非公平锁(默认)
ReentrantLock nonFairLock = new ReentrantLock();

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

ReadWriteLock

ReadWriteLock 接口及其实现 ReentrantReadWriteLock 提供了读写分离的锁机制,允许多个读操作同时进行,但写操作独占。

示例:

private final ReadWriteLock rwLock = new ReentrantReadWriteLock();

public void readMethod() {
    rwLock.readLock().lock();
    try {
        // 读操作
    } finally {
        rwLock.readLock().unlock();
    }
}

public void writeMethod() {
    rwLock.writeLock().lock();
    try {
        // 写操作
    } finally {
        rwLock.writeLock().unlock();
    }
}

StampedLock

StampedLock 是 Java 8 引入的一种新的锁机制,提供了乐观读锁、悲观读锁和写锁三种模式。

示例:

private final StampedLock sl = new StampedLock();

// 写锁
public void writeMethod() {
    long stamp = sl.writeLock();
    try {
        // 写操作
    } finally {
        sl.unlockWrite(stamp);
    }
}

// 悲观读锁
public void readMethod() {
    long stamp = sl.readLock();
    try {
        // 读操作
    } finally {
        sl.unlockRead(stamp);
    }
}

// 乐观读锁
public void optimisticRead() {
    long stamp = sl.tryOptimisticRead();
    // 读操作
    if (!sl.validate(stamp)) {
        stamp = sl.readLock();
        try {
            // 重新读操作
        } finally {
            sl.unlockRead(stamp);
        }
    }
}

Condition 对象

Condition 接口提供了类似 Object.wait()Object.notify() 的功能,但更灵活,可以与 ReentrantLock 配合使用。

示例:

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

public void awaitMethod() throws InterruptedException {
    lock.lock();
    try {
        condition.await();
    } finally {
        lock.unlock();
    }
}

public void signalMethod() {
    lock.lock();
    try {
        condition.signal();
    } finally {
        lock.unlock();
    }
}

原子类

java.util.concurrent.atomic 包提供了一系列原子类,如 AtomicIntegerAtomicLong 等,它们使用 CAS(Compare-And-Swap)操作实现无锁线程安全。

示例:

private final AtomicInteger counter = new AtomicInteger(0);

public void increment() {
    counter.incrementAndGet();
}

锁的选择建议

  • 简单场景:使用 synchronized 关键字
  • 需要更灵活的控制:使用 ReentrantLock
  • 读写分离场景:使用 ReadWriteLock
  • 高性能读多写少场景:考虑 StampedLock
  • 简单计数器场景:使用原子类

java如何实现锁

分享给朋友:

相关文章

如何实现vue

如何实现vue

安装 Vue.js 使用 npm 或 yarn 安装 Vue.js。确保已安装 Node.js 环境。 npm install vue # 或 yarn add vue 创建 Vue 实例 在 H…

php如何实现静态化

php如何实现静态化

PHP 实现静态化的方法 使用 ob_start() 和 ob_get_contents() 利用 PHP 的输出缓冲功能捕获动态生成的页面内容,将其保存为静态文件。这种方法适用于内容不频繁变化的页面…

如何运行java程序

如何运行java程序

编写Java代码 创建一个以.java为扩展名的文件,例如HelloWorld.java。文件内容需包含一个类定义,类名必须与文件名一致。例如: public class HelloWorld {…

vue项目如何实现

vue项目如何实现

安装Vue.js 通过npm或yarn安装Vue.js。确保Node.js环境已配置完成。 npm install vue # 或 yarn add vue 创建Vue项目 使用Vue CLI工具…

java如何自学

java如何自学

确定学习目标和路径 自学Java需要明确目标,例如开发Web应用、Android应用或后端服务。根据目标选择学习重点,如Java基础、Spring框架或Android开发。制定阶段性计划,从基础语法到…

java如何配置环境变量

java如何配置环境变量

配置Java环境变量的方法 下载并安装JDK 从Oracle官网或OpenJDK下载适合操作系统的JDK安装包。运行安装程序并按照提示完成安装,记下JDK的安装路径(例如C:\Program File…