Java用持久化存储实现锁定机制

标签 java multithreading groovy semaphore key-value-store

我已经实现了 Groovy/Java JAR 文件,其中包含在移动设备上安装应用程序以及获取移动设备上安装的应用程序的属性和设备的属性的方法。

我想实现一种读写锁定机制,只允许一定数量的用户访问设备。写锁为:每个移动设备 1 个请求,读锁为每个移动设备 10 个请求。

Java 信号量似乎是解决此问题的好方法,允许为读写锁分配多个请求。但我还需要持久存储针对每个设备获取的每个锁的状态。

任何有关如何在没有信号量的情况下执行此操作的建议将不胜感激。我预计设备数量将少于 50 个,并发用户请求将少于 100 个。

最佳答案

您可以将ReentrantReadWriteLockBlockingQueue结合使用。 ReentrantReadWriteLock用于允许一个写入者,而BlockingQueue则限制N个读取者同时读取。像这样的事情:

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class DeviceHandler
{
    private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
    private BlockingQueue<Object> readersQueue = new ArrayBlockingQueue<>(10);

    public void read() throws InterruptedException
    {
        // if queue is full, this blocks until another thread removes an object
        readersQueue.put(new Object());
        // this blocks if another thread acquires the write lock
        reentrantReadWriteLock.readLock().lock();

        // do read action

        reentrantReadWriteLock.readLock().unlock();
        readersQueue.take();
    }

    public void write()
    {
        // this blocks if the read lock is acquired by other threads
        reentrantReadWriteLock.writeLock().lock();

        // do write action

        reentrantReadWriteLock.writeLock().unlock();
    }
}

关于Java用持久化存储实现锁定机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60305321/

相关文章:

java - 获取正则表达式的匹配值

java - 基于 Maven 的 JAX WS 项目无法在 Eclipse 中运行

c# - 资源静态时从不同的线程访问相同的资源

groovy - 沙盒阻止我格式化字符串

java - JSR-292(invokedynamic)对 Groovy 性能有多大影响?

java - 实例方法重写与字段隐藏

java - 定义 keyPreference 使 imageView 可见和不可见

java - 带有 java 和 groovy 源文件夹的 Maven 项目,如何在 POM 中表示

java - Double Check Lock 在此 java 代码上不起作用?

java - Thread.sleep(x) 是否足够准确以用作 Android 中的时钟?