【问题标题】:ReentrantReadWriteLock blocking me from act on an object?ReentrantReadWriteLock 阻止我对对象采取行动?
【发布时间】:2019-01-05 10:15:29
【问题描述】:

我有以下对象:

    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);

提前谢谢你!

【问题讨论】:

    标签: java multithreading concurrency reentrantreadwritelock


    【解决方案1】:

    是的,您将能够从 dataStructure 对象中读取,同时有人将持有锁进行写入或读取,因为您正在为注册用户使用线程安全的 ConcurrentHashMap。

    如果您为注册用户使用普通的 HashMap,您仍然可以从注册用户中读取,但您会看到不正确/陈旧的数据,因为普通的 HashMap 不是线程安全的,并且您在没有锁的情况下访问它。

    【讨论】:

    • 谢谢!你回答了我的问题
    猜你喜欢
    • 2023-03-03
    • 2012-05-06
    • 2021-10-16
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    相关资源
    最近更新 更多