gpt4 book ai didi

java - ReentrantReadWriteLock 阻止我对对象进行操作?

转载 作者:行者123 更新时间:2023-12-02 10:24:45 26 4
gpt4 key购买 nike

我有以下对象:

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

我有以下 block :

    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

现在,我知道当第一个代码块发生时,第二个代码块将等待第一个代码块完成,我的问题是在下一个代码块中我是否能够读取尽管我没有提到任何 ReentrantReadWriteLock 锁,但有人会同时写入或读取 dataStructure 对象:

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

提前谢谢您!

最佳答案

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

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

关于java - ReentrantReadWriteLock 阻止我对对象进行操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54050976/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com