Added ReadWriteLock instead of synchronize blocks

This commit is contained in:
Andrey Terentev 2024-03-13 16:19:29 +07:00 committed by Andrey Terentev
parent 8a9da6c534
commit a66ded3d9d

View File

@ -13,6 +13,8 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
@Repository @Repository
@RequiredArgsConstructor @RequiredArgsConstructor
@ -22,10 +24,12 @@ public class NodeRepositoryImpl implements NodeRepository {
private final PickerRepository pickerRepository; private final PickerRepository pickerRepository;
private final NodeId2PickerModeCache nodeId2PickerModeCache; private final NodeId2PickerModeCache nodeId2PickerModeCache;
private final Map<String, Node> nodeMap = new ConcurrentHashMap<>(); private final Map<String, Node> nodeMap = new ConcurrentHashMap<>();
private final ReadWriteLock lock = new ReentrantReadWriteLock();
@Override @Override
public void create(Node node) throws NodeAlreadyExistException { public void create(Node node) throws NodeAlreadyExistException {
synchronized (nodeMap) { lock.writeLock().lock();
try {
if (nodeMap.containsKey(node.getIdentifier())) { if (nodeMap.containsKey(node.getIdentifier())) {
throw new NodeAlreadyExistException(node.getIdentifier()); throw new NodeAlreadyExistException(node.getIdentifier());
} }
@ -33,33 +37,44 @@ public class NodeRepositoryImpl implements NodeRepository {
nodeMap.put(node.getIdentifier(), node); nodeMap.put(node.getIdentifier(), node);
var picker = pickerRepository.create(node.getIdentifier(), node.getPickingMethod()); var picker = pickerRepository.create(node.getIdentifier(), node.getPickingMethod());
nodeId2PickerModeCache.put(node.getIdentifier(), picker); nodeId2PickerModeCache.put(node.getIdentifier(), picker);
}
roomRepository.onCreateNode(node); roomRepository.onCreateNode(node);
} finally {
lock.writeLock().unlock();
}
} }
@Override @Override
public List<Room> delete(Node node) { public List<Room> delete(Node node) {
synchronized (nodeMap) { lock.writeLock().lock();
try {
nodeMap.remove(node.getIdentifier()); nodeMap.remove(node.getIdentifier());
pickerRepository.remove(node.getIdentifier()); pickerRepository.remove(node.getIdentifier());
nodeId2PickerModeCache.remove(node.getIdentifier()); nodeId2PickerModeCache.remove(node.getIdentifier());
}
return roomRepository.onRemoveNode(node); return roomRepository.onRemoveNode(node);
} finally {
lock.writeLock().unlock();
}
} }
@Override @Override
public Optional<Node> find(String nodeId) { public Optional<Node> find(String nodeId) {
synchronized (nodeMap) { lock.readLock().lock();
try {
return nodeMap.containsKey(nodeId)? Optional.of(nodeMap.get(nodeId)) : Optional.empty(); return nodeMap.containsKey(nodeId)? Optional.of(nodeMap.get(nodeId)) : Optional.empty();
} finally {
lock.readLock().unlock();
} }
} }
@Override @Override
public List<Node> all() { public List<Node> all() {
synchronized (nodeMap) { lock.readLock().lock();
try {
return nodeMap.values().stream().toList(); return nodeMap.values().stream().toList();
} finally {
lock.readLock().unlock();
} }
} }
} }