Java 使用持久存储实现锁定机制
Java Implement locking mechanism with persistent storage
我已经实现了 Groovy / Java JAR 文件,其中包含在移动设备上安装应用程序以及获取移动设备上安装的应用程序的属性和设备属性的方法。
我想实现一种只允许一定数量的用户访问设备的读写锁定机制。写入锁定将是:每个移动设备 1 个请求,读取锁定每个移动设备 10 个请求。
Java 信号量似乎是解决此问题的好方法,允许为读写锁分配多个请求。但我还需要持久存储针对每个设备获取的每个锁的状态。
任何有关如何在没有信号量的情况下执行此操作的建议将不胜感激。我预计少于 50 台设备和少于 100 个并发用户请求。
您可以将 ReentrantReadWriteLock
与 BlockingQueue
一起使用。 ReentrantReadWriteLock
用于允许一个writer,而BlockingQueue
限制N个reader同时读取。像这样:
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();
}
}
我已经实现了 Groovy / Java JAR 文件,其中包含在移动设备上安装应用程序以及获取移动设备上安装的应用程序的属性和设备属性的方法。
我想实现一种只允许一定数量的用户访问设备的读写锁定机制。写入锁定将是:每个移动设备 1 个请求,读取锁定每个移动设备 10 个请求。
Java 信号量似乎是解决此问题的好方法,允许为读写锁分配多个请求。但我还需要持久存储针对每个设备获取的每个锁的状态。
任何有关如何在没有信号量的情况下执行此操作的建议将不胜感激。我预计少于 50 台设备和少于 100 个并发用户请求。
您可以将 ReentrantReadWriteLock
与 BlockingQueue
一起使用。 ReentrantReadWriteLock
用于允许一个writer,而BlockingQueue
限制N个reader同时读取。像这样:
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();
}
}