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