Является ли Map of Locks безопасным подходом для одновременных операций?
Требование состоит в том, что только одному потоку должно быть разрешено выполнять операции управления пользователем (создание / обновление / импорт), но нескольким потокам не разрешено выполнять операции пользователя одновременно для одного и того же пользователя. Например, когда поток A создает пользователя A, тогда одновременно потоку B не должно быть разрешено импортировать пользователя A или создавать пользователя A, но потоку B разрешено импортировать пользователя B. Безопасен ли приведенный ниже поток кода для этих требований?
public class UserManagement {
ConcurrentHashMap<Integer, Lock> userLock = new ConcurrentHashMap<>();
public void createUser(User user, Integer userId) {
Lock lock = userLock.putIfAbsent(userId, new ReentrantLock());
try {
lock.lock();
//create user logic
} finally {
lock.unlock();
}
}
public void importUser(User user, Integer userId) {
Lock lock = userLock.putIfAbsent(userId, new ReentrantLock());
try {
lock.lock();
//import user logic
} finally {
lock.unlock();
}
}
public void updateUser(User user, Integer userId) {
Lock lock = userLock.putIfAbsent(userId, new ReentrantLock());
try {
lock.lock();
// update user logic
} finally {
lock.unlock();
}
}
}