Я бы сделал это простым способом, используя synchronized
.
class UserMaps {
private Map<Integer, User> users = new ConcurrentHashMap<>();
private Map<String, User> usersByName = new ConcurrentHashMap<>();
private Map<String, User> usersByEmail = new ConcurrentHashMap<>();
public synchronized int put(User user) {
users.put(user.getId(), user);
usersByName.put(user.getUsername(), user);
usersByEmail.put(user.getEmail(), user);
return user.getId();
}
}
. Это обеспечило бы постоянное обновление всех карт, если все ваши получатели также synchronized
.
*.1007 * Если, однако, вы хотите повысить производительность и не хотите
всех ваших методов
synchronized
, используйте
ReadWriteLock
.
class UserMaps {
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private Map<Integer, User> users = new ConcurrentHashMap<>();
private Map<String, User> usersByName = new ConcurrentHashMap<>();
private Map<String, User> usersByEmail = new ConcurrentHashMap<>();
public int saveUserToMap(User user) {
lock.writeLock().lock();
try {
users.put(user.getId(), user);
usersByName.put(user.getUsername(), user);
usersByEmail.put(user.getEmail(), user);
return user.getId();
} finally {
lock.writeLock().unlock();
}
}
public User getById(int id) {
lock.readLock().lock();
try {
return users.get(id);
} finally {
lock.readLock().unlock();
}
}
}