Ist Map of Locks ein sicherer Ansatz für gleichzeitige Operationen

Die Voraussetzung ist, dass nur ein einziger Thread zur Ausführung von Benutzerverwaltungsvorgängen (Erstellen / Aktualisieren / Importieren) zugelassen ist. Es ist jedoch nicht zulässig, dass mehrere Threads gleichzeitig Benutzervorgänge für denselben Benutzer ausführen. Wenn beispielsweise Thread A Benutzer A erstellt, darf Thread B nicht gleichzeitig Benutzer A importieren oder Benutzer A erstellen, aber Thread B darf Benutzer B importieren. Ist der folgende Codethread für diese Anforderungen sicher?

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