O Map of Locks é uma abordagem segura para operações simultâneas
O requisito é que apenas um encadeamento único deve ter permissão para executar operações de gerenciamento de usuário (criar / atualizar / importar), mas vários encadeamentos não podem executar operações do usuário simultaneamente para o mesmo usuário. Por exemplo, quando o Thread A está criando o Usuário A, simultaneamente o Thread B não deve importar o Usuário A ou Criando o Usuário A, mas o Thread B pode importar o Usuário B. O thread de código abaixo é seguro para esses 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();
}
}
}