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();
        }
    }
}

questionAnswers(4)

yourAnswerToTheQuestion