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