Ограничение доступа к объекту только одному потоку в Java - PullRequest
0 голосов
/ 24 декабря 2018

Я только что начал многопоточность с Java и понял, что несколько подходов, которые я использовал для доступа к объектам и их модификации, не работают так же надежно в многопоточной среде.

Например, у меня есть ключ, завернутый так:

class KeyBean {
    private String key; // The key to be retrieved goes here
    private long timestamp; // UNIX-based timestamp

    public String getKey() {
         // is key available? - yes
             // update timestamp
             // return key;
         // is key available - no
             // return null
    }

    public Boolean isKeyAvailable() {
        // xxx seconds have passed
            // return true
        // else
            // return false
    }

Затем у меня есть управляющий класс, который хранит все возможные ключевые объекты в списке

class KeyManager {
    private List<String> keys; // The key to be retrieved goes here

    public String getNextAvailableKey() {
         // iterate list until available key is found
         // return key;
    }
}

Идея в том, что управляющий объект будет запрошен для ключа.Когда запрос получен, он будет перебирать список ключей (не длинный список ... максимум 20).

Как только будет найден доступный ключ, он будет возвращен объекту, выполняющему запрос.

В одном потоке это работало просто отлично, но в среде, где я являюсь многопоточным, есть случаи, когда два потока, перебирающие этот список ключей, могут одновременно обращаться к ключевому объекту, что приводит к многократному использованиюключа, который не предназначен.

Так что мне просто интересно, каков наилучший подход для «блокировки» доступа к объекту в тот момент, когда к нему обращаются, чтобы его мог использовать только один поток.Идеальное решение позволяло бы другим потокам проходить через этот объект и продолжать поиск других ключей, и после того, как этот конкретный ключ был использован, он возвращается в пул для доступа следующего потока.

К сожалению, я неточно уверен, какая терминология используется для решения в этом случае, поэтому я спрашиваю в надежде, что смогу получить какое-то направление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...