Java Реализация механизма блокировки с постоянным хранилищем - PullRequest
1 голос
/ 19 февраля 2020

Я реализовал Groovy / Java JAR-файл, содержащий методы установки приложений на мобильные устройства, а также получения свойств приложений, установленных на мобильном устройстве, и свойств устройства.

Я хотел бы реализовать механизм блокировки чтения и записи, который разрешает доступ к устройству только определенному количеству пользователей. Блокировка записи будет: 1 запрос на мобильное устройство и 10 запросов на мобильное устройство.

Java Семафор кажется хорошим способом решения этой проблемы, позволяя количеству запросов, выделенных для чтения и блокировка записи Но мне также нужно постоянно сохранять состояния каждой блокировки, полученной для каждого устройства.

Буду признателен за любой совет, как это сделать даже без семафоров. Я ожидаю менее 50 устройств и менее 100 одновременных пользовательских запросов.

1 Ответ

2 голосов
/ 19 февраля 2020

Вы можете использовать ReentrantReadWriteLock с BlockingQueue. 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();
    }
}
...