synchronizedMap
의 이름이 doMapOperation
인 동기화 목록을 가지고 있습니다. 이 함수에서는지도에서 항목을 추가/제거하고 이러한 객체에서 값 비싼 연산을 수행해야합니다. 동기화 된 블록에서 값 비싼 연산을 호출하고 싶지는 않지만 이러한 연산을 수행하는 동안지도가 일관된 상태인지 확인하는 방법을 알지 못합니다. 이 작업을 수행하는 올바른 방법은 무엇입니까?값 비싼 작업으로 인한 콜렉션에서의 Java 동기화
이렇게하면 동기화 블록에 비용이 많이 드는 작업을 호출 피하려고하기 때문에 나는 확신 내 초기 레이아웃이 잘못이다 : 당신이 이런 짓을 했을까하는 방법,
public void doMapOperation(Object key1, Object key2) {
synchronized (synchronizedMap) {
// Remove key1 if it exists.
if (synchronizedMap.containsKey(key1)) {
Object value = synchronizedMap.get(key1);
value.doExpensiveOperation(); // Shouldn't be in synchronized block.
synchronizedMap.remove(key1);
}
// Add key2 if necessary.
Object value = synchronizedMap.get(key2);
if (value == null) {
Object value = new Object();
synchronizedMap.put(key2, value);
}
value.doOtherExpensiveOperation(); // Shouldn't be in synchronized block.
} // End of synchronization.
}
내가이 질문의 연속으로 생각 루프에?
public void doMapOperation(Object... keys) {
synchronized (synchronizedMap) {
// Loop through keys and remove them.
for (Object key : keys) {
// Check if map has key, remove if key exists, add if key doesn't.
if (synchronizedMap.containsKey(key)) {
Object value = synchronizedMap.get(key);
value.doExpensiveOperation(); // Shouldn't be here.
synchronizedMap.remove(key);
} else {
Object value = new Object();
value.doAnotherExpensiveOperation(); // Shouldn't here.
synchronizedMap.put(key, value);
}
}
} // End of synchronization block.
}
감사합니다.
느린 작업 중에 잠금을 해제 할 수 있는지 여부를 알 수있는 정보가 충분하지 않습니다. 중요한 질문은이 모든 작업이 다른 스레드에 원자 적으로 발생해야하는지 여부입니다. 그렇지 않으면 어떤 작업이 원자 적으로 나타나야합니까? 그리고 작업은 전체 맵에서 원자 적으로 발생해야합니까? 즉, 단일 키에 대한 작업이 원자적일 수 있도록 보장 할 수 있다면 어떨까요? – erickson