나는 List
을 여러 번 읽고 여러 번 쓰지만 거의 업데이트되지는 않습니다 (읽기 횟수가 50,000 배 이상 많습니다). 편집 : 사실, 배열이 목록 대신 충분한 경우이 충분합니다.비동기 동시 목록 또는 배열을 원자 적으로 바꾸는 방법
목록이 업데이트되면 단순히 다른 버전으로 바뀝니다 (add()
또는 remove()
호출이 없음).
CopyOnWriteArrayList 동기화 된 목록의 단점을 피할 수 있지만 새 값으로 목록을 설정하면 원자가 확실하지 않습니다. 나는 this 질문도 읽었다.
일부 코드를 표시합니다. 싱글 톤 스프링 빈의 속성으로 다음을 고려하십시오.
List<MyObject> myList; //the list read many times and concurrently.
//called by many threads
public void doStuff(){
for (MyObject mo : myList){
//do something
}
}
//called rarely. It's synchronized to prevent concurrent updates
//but my question is about thread-safety with regards to readers
public synchronized void updateList(List<MyObject> newList){ // newList is a CopyOnWriteArrayList<>();
myList = myNewList; //is this following statement executed atomically and thread-safe for readers?
}
스레드 안전 집합을 얻으려면 ReadWriteLock을 사용해야합니까?
목록을 '휘발성으로 만드는 것'으로 충분할 것이라고 생각합니다. –