当前位置:首页 > Java

java如何锁住资源

2026-03-23 22:16:15Java

锁住资源的方法

在Java中,可以通过多种方式实现对资源的锁定,确保多线程环境下的线程安全。以下是几种常见的锁机制及其使用方法。

synchronized关键字

使用synchronized关键字可以修饰方法或代码块,确保同一时间只有一个线程能访问被锁定的资源。

public class SynchronizedExample {
    private int count = 0;

    // 修饰方法
    public synchronized void increment() {
        count++;
    }

    // 修饰代码块
    public void incrementBlock() {
        synchronized (this) {
            count++;
        }
    }
}

ReentrantLock

ReentrantLockjava.util.concurrent.locks包下的显式锁,提供了比synchronized更灵活的锁定机制。

import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockExample {
    private final ReentrantLock lock = new ReentrantLock();
    private int count = 0;

    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }
}

ReadWriteLock

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

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

public class ReadWriteLockExample {
    private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
    private int value = 0;

    public int getValue() {
        rwLock.readLock().lock();
        try {
            return value;
        } finally {
            rwLock.readLock().unlock();
        }
    }

    public void setValue(int newValue) {
        rwLock.writeLock().lock();
        try {
            value = newValue;
        } finally {
            rwLock.writeLock().unlock();
        }
    }
}

StampedLock

StampedLock是Java 8引入的锁,支持乐观读锁,适用于读操作远多于写操作的场景。

java如何锁住资源

import java.util.concurrent.locks.StampedLock;

public class StampedLockExample {
    private final StampedLock lock = new StampedLock();
    private int value = 0;

    public int getValue() {
        long stamp = lock.tryOptimisticRead();
        int currentValue = value;
        if (!lock.validate(stamp)) {
            stamp = lock.readLock();
            try {
                currentValue = value;
            } finally {
                lock.unlockRead(stamp);
            }
        }
        return currentValue;
    }

    public void setValue(int newValue) {
        long stamp = lock.writeLock();
        try {
            value = newValue;
        } finally {
            lock.unlockWrite(stamp);
        }
    }
}

注意事项

  • 使用显式锁(如ReentrantLock)时,务必在finally块中释放锁,避免死锁。
  • synchronized是隐式锁,由JVM自动管理,但灵活性较低。
  • 根据场景选择合适的锁机制,例如高并发读操作可使用ReadWriteLockStampedLock

标签: 锁住资源
分享给朋友:

相关文章

java如何获取资源

java如何获取资源

获取资源的方法 在Java中获取资源可以通过多种方式实现,具体取决于资源的类型和存放位置。以下是几种常见的方法: 通过ClassLoader获取资源 使用ClassLoader的getResourc…

PHP收费资源实现

PHP收费资源实现

PHP收费资源实现方法 用户权限验证 使用PHP内置的会话管理功能session_start()和$_SESSION来跟踪用户登录状态。结合数据库查询验证用户订阅状态,确保只有付费用户能访问资源。…

java如何获取资源

java如何获取资源

Java获取资源的方法 在Java中获取资源可以通过多种方式实现,具体取决于资源的类型和存储位置。以下是几种常见的资源获取方法: 使用ClassLoader获取类路径资源 通过ClassLoader…

vue实现数字资源

vue实现数字资源

Vue 实现数字资源管理 在 Vue 中实现数字资源管理通常涉及文件上传、预览、下载等功能。以下是常见的实现方法: 文件上传组件 使用 input 标签结合 FormData 实现文件上传: &l…

react静态资源如何访问

react静态资源如何访问

访问React静态资源的常见方法 使用public文件夹 在React项目中,public文件夹下的文件会直接复制到构建输出目录。可以通过相对路径直接访问,例如将图片放在public/images中,…

PHP收费资源实现

PHP收费资源实现

PHP 收费资源实现方法 用户验证与权限控制 使用 PHP 的会话管理(session_start())和数据库验证来确保只有付费用户才能访问资源。结合角色或订阅级别(如基础版、高级版)进行权限分级。…