当前位置:首页 > Java

java如何上锁

2026-03-19 21:02:11Java

Java 中的锁机制

Java 提供了多种锁机制来控制多线程并发访问共享资源,确保线程安全。以下是常见的锁实现方式:

使用 synchronized 关键字

synchronized 是 Java 中最基础的锁机制,可以修饰方法或代码块:

java如何上锁

// 修饰实例方法
public synchronized void method() {
    // 临界区代码
}

// 修饰静态方法
public static synchronized void staticMethod() {
    // 临界区代码
}

// 修饰代码块(指定锁对象)
public void block() {
    synchronized (this) {  // 锁对象可以是任意对象
        // 临界区代码
    }
}

使用 ReentrantLock

ReentrantLockjava.util.concurrent.locks 包提供的显式锁,比 synchronized 更灵活:

import java.util.concurrent.locks.ReentrantLock;

private final ReentrantLock lock = new ReentrantLock();

public void lockMethod() {
    lock.lock();  // 获取锁
    try {
        // 临界区代码
    } finally {
        lock.unlock();  // 必须在 finally 中释放锁
    }
}

使用 ReadWriteLock

ReadWriteLock 支持读写分离,适用于读多写少的场景:

java如何上锁

import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

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 引入的乐观读锁,性能更高:

import java.util.concurrent.locks.StampedLock;

private final StampedLock stampedLock = new StampedLock();

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

public void write() {
    long stamp = stampedLock.writeLock();
    try {
        // 写操作
    } finally {
        stampedLock.unlockWrite(stamp);
    }
}

使用 Lock 接口的其他实现

Java 还提供了其他锁实现,如 SemaphoreCountDownLatch 等,适用于特定场景:

import java.util.concurrent.Semaphore;

private final Semaphore semaphore = new Semaphore(1);  // 允许1个线程访问

public void semaphoreMethod() throws InterruptedException {
    semaphore.acquire();
    try {
        // 临界区代码
    } finally {
        semaphore.release();
    }
}

锁的选择建议

  • 简单场景优先使用 synchronized,代码简洁且自动释放锁。
  • 需要超时或可中断的锁操作时,使用 ReentrantLock
  • 读多写少时选择 ReadWriteLockStampedLock
  • 特定并发控制需求(如限流)可使用 Semaphore

标签: java
分享给朋友:

相关文章

java如何安装

java如何安装

安装Java的步骤 下载Java开发工具包(JDK) 访问Oracle官方网站或OpenJDK项目页面下载适合操作系统的JDK版本。Oracle JDK适用于商业用途,OpenJDK是开源版本。选择…

如何学好java

如何学好java

理解基础概念 掌握Java的核心概念是学习的基础。包括数据类型、变量、运算符、控制流(如循环和条件语句)、数组等。理解面向对象编程(OOP)的四大特性:封装、继承、多态和抽象。 实践编程练习 通过实…

如何查看java版本

如何查看java版本

查看Java版本的命令行方法 在终端或命令提示符中运行以下命令,可以快速查看已安装的Java版本: java -version 输出示例: java version "17.0.1" 20…

java如何创建线程

java如何创建线程

在Java中创建线程主要有两种方式:继承Thread类和实现Runnable接口。以下是具体实现方法: 继承Thread类 通过继承Thread类并重写run()方法,可以创建一个线程。启动线程时调…

如何用java

如何用java

使用Java进行开发 Java是一种广泛使用的编程语言,适用于多种应用场景,包括Web开发、移动应用开发、企业级应用等。以下是Java开发的基本步骤和常见应用场景。 安装Java开发环境 下载并安装…

java如何使用

java如何使用

安装Java开发环境 下载并安装JDK(Java Development Kit),推荐从Oracle官网或OpenJDK获取最新版本。安装完成后配置环境变量,确保JAVA_HOME指向JDK安装路径…