ReentrantReadWriteLock блокирует меня от действия над объектом? - PullRequest
0 голосов
/ 05 января 2019

У меня есть следующий объект:

    public class DataStructures {
    public Map<String, User> registeredUser;
    private ReadWriteLock readWriteLock;

    public DataStructures() {
        this.registeredUser = new ConcurrentHashMap<>();
        readWriteLock = new ReentrantReadWriteLock(true);
    }

    public ReadWriteLock getReadWriteLock() {
        return readWriteLock;
    }
}

У меня есть следующий блок:

    if(user != null && user.status()) {
            String userNameList = "";
            dataStructures.getReadWriteLock().readLock().lock();//ReentrantReadWriteLock
            List<User> userList = new ArrayList<>(dataStructures.registeredUser.values());
            //Will perform a sort on the userlist according their initial registration number
            Collections.sort(userList, Comparator.comparing(User::getRegistrationId));
                for (User tmpUser : userList) {
                    userNameList += tmpUser.getUsername() + " ";
                }
                connections.send(connectionId, "10 " + "7 " + userList.size() + " " + userNameList);
                dataStructures.getReadWriteLock().readLock().unlock();//ReentrantReadWriteLock
}

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

также у меня есть следующий код:

dataStructures.getReadWriteLock().writeLock().lock();//ReentrantReadWriteLock
    if(dataStructures.registeredUser.putIfAbsent(username, new User(username, password, dataStructures.registraionId)) == null) {
            connections.send(connectionId, "10 " + "01");
            dataStructures.registraionId++;
    }
    else
        connections.send(connectionId, "11 " + "01");
    dataStructures.getReadWriteLock().writeLock().unlock();//ReentrantReadWriteLock

Теперь я знаю, что когда произойдет первый блок кода, второй будет ждать окончания первого, мой вопрос заключается в том, смогу ли я прочитать следующий блок кода из dataStructure объект в то же время, что кто-то будет писать или читать с него, несмотря на то, что я не упомянул ни одной из блокировок ReentrantReadWriteLock:

String username = seperate[1];
    String password = seperate[2];
    User user = dataStructures.registeredUser.get(username);

Заранее спасибо!

1 Ответ

0 голосов
/ 05 января 2019

Да, вы сможете читать из объекта dataStructure в то же время, когда кто-то будет писать или читать, удерживая блокировку, потому что вы используете потоковый ConcurrentHashMap для зарегистрированного пользователя.

Если вы используете обычный HashMap для зарегистрированного пользователя, вам все равно будет разрешено чтение из зарегистрированного пользователя, но вы увидите некорректные / устаревшие данные, потому что обычный HashMap не является поточно-ориентированным, и вы получаете к нему доступ без блокировки.

...