У меня есть следующий объект:
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);
Заранее спасибо!