2010-02-13 12 views
41

Collections.synchronizedMap()을 사용하여 승/o없이 동시성의 정확성을 유지하면서 다음 코드를 재 작성할 수 있습니까?WeakHashMap에 상응하는 java.util.concurrent가 있습니까?

Collections.synchronizedMap(new WeakHashMap<Class, Object>()); 

즉, 대신 java.util.concurrent에서 사용할 수있는 항목이 있습니까? 단지 분명히

new ConcurrentHashMap<Class, Object>(new WeakHashMap<Class, Object>())); 

로 교체하는 I가 생각하지 않습니다

+1

과 같은 고도의 동시성 데이터 구조의 중요한 이점'ConcurrentHashMap'없이 (다양한 기술을 통해)이 할 수있는 스레드 안전 부하가 남아있다 (많은) 블로킹. 클래스의 부하가 크지 않으면 ConcurrentHashMap을 사용한 성능이 HashMap보다 * 나쁠 수 있다는 것을 알아야합니다. 자신의 환경이 외부 동기화를 사용할 수 있다는 주장이 거의 없을 것으로 예상된다면 괜찮을 것입니다. – scottb

답변

33

GuavaCacheBuilder 클래스를 사용하면이 작업을 쉽게 수행 할 수 있습니다. 이 키 평등의 의미를 변경하는 것이

CacheBuilder.newBuilder().weakKeys().build() 

참고 Class 인스턴스를 사용하는 사용자의 경우 문제가 아니라 잠재적 인 함정이되지 않습니다 == 대신 .equals() 수 있습니다.

+0

은 평등 의미 론적을 평등하게 사용자 정의하는 방법입니까? – gstackoverflow

+0

Guava 링크가 업데이트되었습니다. https://github.com/google/guava 및 CacheBuilder에 대한 링크가 업데이트되었습니다. https://google.github.io/guava/releases/18.0/api/docs/com/google/common/ cache/CacheBuilder.html –

18

작동하지 않습니다. 실제로, javadoc는 Collections.synchronizedMap()의 사용을 제안합니다.

"대부분의 콜렉션 클래스와 같이,이 클래스는 동기화되지 않습니다. 동기화 된 WeakHashMap는, Collections.synchronizedMap 메소드를 사용해 구축 할 수 있습니다.

+0

putIfAbsent 메소드를 가지고 있지 않다는 것을 유감스럽게 생각합니다 ... – rogerdpack

+0

@rogerdpack :하지만 WeakHashMap을 롤 쓰레드 'ThreadSafeWeakHashMap'으로 작성하면 모니터 잠금을 사용하여 직접 putIfAbsent (...를 작성하십시오.) 꽤 쉽게. 이것은 무거운 짐 하에서는 차선책 이겠지만 모든 짐이 무겁지는 않다고 동의했다. – scottb

+1

@rogerdpack 이제 Java 8 ftw – qualidafial

-1

동기화 된 맵 래퍼를 우회하여 가비지 수집기가 언제든지 직접 weakreferences를 직접 수정할 수 있기 때문에 동기화 된 맵에서 WeakHashMap을 래핑하는 것이 여전히 올바르게 작동합니까? WeakHashMap은 단일 스레드 모델에서만 진정으로 작동한다고 생각합니다.

0

는 가비지 컬렉터가 언제든지 직접있는 WeakReferences을 수정할 수 있기 때문에 동기화지도 래퍼를 거치지 않고, 여전히 올바르게 수행 할 작업에 대한 작업 동기화 맵에서의 WeakHashMap를 포장 하는가? WeakHashMap은 단일 스레드 모델 에서만 실제로 작동한다고 생각합니다.

위에서 언급 한 바와 같이, https://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html에서의 WeakHashMap에 대한 문서는 특히 말한다 :

나에게 의미

"A 동기화의 WeakHashMap은 에는 Collections.synchronizedMap 방법을 사용하여 구성 될 수있다" 이 기술은 가비지 수집기의 동작과 함께 사용해야합니다 (설명서가 버그가 없다면!)

+0

수정. JVM은 항상 멀티 스레드입니다. GC 스레드, 파이널 라이저 스레드 등이 있습니다. WeakHashMap이 명시 적으로 다중 스레드 된 Java 프로그램에서 작동하지 않으면 단일 스레드에서 작동하는 방법을보기 어렵습니다. – Doradus

0

Cafeine은 구아바 캐시의 인기 경쟁 업체입니다.

- keys automatically wrapped in weak references 
- values automatically wrapped in weak or soft references 

사용은 :

LoadingCache<Key, Graph> graphs = Caffeine.newBuilder() 
.weakKeys() 
.weakValues() 
.build(key -> createExpensiveGraph(key));