- 세 가지 목록이 자유롭고 독립적으로 가끔
- 읽기 에 대한 액세스 (5 분마다), 모두 새로운 값으로 업데이트됩니다. 목록간에 몇 가지 종속성이 있습니다. 예를 들어, 세 번째 것은 읽지 않고 두 번째 것은 업데이트되고 첫 번째 것은 이미 새로운 값을 갖습니다. 세 가지 목록의 일관성을 깨뜨릴 수 있습니다.
초기 아이디어는 3 개의 목록이있는 컨테이너 개체를 속성으로 만드는 것입니다.
그러면 동기화가 먼저 해당 개체에서 수행되고, 세 개의 목록 각각에서 차례로 동기화됩니다.
- 안전이 초안 (교착 상태, 데이터 일관성)이며,
일부 코드는 그래서 여기 ... 어 싸우 전드 워즈 가치가 초안
private class Sync { final List<Something> a = Collections.synchronizedList(new ArrayList<Something>()); final List<Something> b = Collections.synchronizedList(new ArrayList<Something>()); final List<Something> c = Collections.synchronizedList(new ArrayList<Something>()); } private Sync _sync = new Sync(); ... void updateRunOnceEveryFiveMinutes() { final List<Something> newa = new ArrayList<Something>(); final List<Something> newb = new ArrayList<Something>(); final List<Something> newc = new ArrayList<Something>(); ...building newa, newb and newc... synchronized(_sync) { synchronized(_sync.a) { _synch.a.clear(); _synch.a.addAll(newa); } synchronized(_sync.b) { ...same with newb... } synchronized(_sync.c) { ...same with newc... } } // Next is accessed by clients public List<Something> getListA() { return _sync.a; } public List<Something> getListB() { ...same with b... } public List<Something> getListC() { ...same with c... }
문제가 될 것입니다?
- 특정 문제에 대한 구현 제안 사항이 더 좋습니까?
업데이트는
는 _sync 동기화 및 newa ... 건물의 순서를 변경.
감사
+1 스레드 동기화 필요 없음, 휘발성 키워드는 로컬 스레드 캐싱을 방지하며, 모든 목록은 동일한 업데이트 된 상태의 클라이언트에 제공됩니다 ... 완벽하게 들립니다! 부정적인 의견/경고 또는 더 나은 (정말로?) 해결책이 게시되지 않는 한, 이것이 수용되는 대답이 될 것입니다. –