¿Es Map of Locks un enfoque seguro para operaciones concurrentes?
El requisito es que solo se debe permitir que un solo subproceso realice operaciones de administración de usuarios (crear / actualizar / importar), pero no se permite que varios subprocesos realicen operaciones de usuario simultáneamente para el mismo usuario. Por ejemplo, cuando el subproceso A está creando el usuario A, al mismo tiempo no se debe permitir que el subproceso B importe al usuario A o crear al usuario A, pero el subproceso B puede importar al usuario B. ¿Es seguro el siguiente subproceso de código para estos requisitos?
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();
}
}
}