2013-12-13 2 views
4

첫 번째 스레드는 주제를 수신하는 JMS 구독자입니다. 메시지를 받으면 해시 맵에 항목을 추가/업데이트/삭제합니다. 다른 스레드는 TimerClass를 사용하여 매 2 분마다 실행되고 동일한 해시 맵의 내용을 읽고이를 파일에 저장하고 해시 맵을 지 웁니다. 어떤 종류의 hashmap- 동시 또는 동기화를 사용해야하는지 제안하십시오. 이것을 달성하는 다른 방법이 있습니까?동일한 해시 맵에 액세스하는 두 개의 스레드가 하나의 스레드가 2 분 후 다른 실행을 계속 실행 중이고 해시 맵을 지우는 방법, Java에서이를 처리하는 방법

+0

솔루션을 제안하기가 어렵습니다. 동기화 수준은 다른 요구 사항에 크게 의존합니다. – Jan

+0

HashMap을 동기화하는 것이 좋습니다 – Sach

+0

내 코드는 기본적으로 하나의 hashmap을 가지며 그 내용은 첫 번째 thead가 추가/업데이트합니다. 내가 물어보고 싶은 것은 동일한 해시 맵을 읽고 2 분 후에 실행되는 두 번째 스레드가 계속 실행중인 첫 번째 스레드의 영향을 받습니까? 그것을 지우려고하는 동안 wriiten되었을 수도 hashmap의 일부 내용을 잃는 possiblity인가? – Yamini

답변

2

동기화가 필요합니다. HashMap은 동기화되지 않으므로.

사용 Collections.SynchronizedMap 또는 Hashtable

+0

그냥 내 의심을 취소하려면 collections.SynchornizedMap을 사용하는 경우 모든 호출을 넣을 필요가 있습니다, 넣어, 동기화 된 블록에 명확한 방법? 동기화 됨 (지도) {}. 또한 내가 Hashtable을 사용한다면 나는 동기화를 취할 필요가 없다. – Yamini

+0

(BTW Hashtable이 동기화 됨) 더 많은 HashMap 작업을 10k/초 이상 호출하지 않으면 Hashtable을 사용하는 것이 좋습니다. 코드를 변경하지 않아도됩니다. 빠른 n 쉬운. –

1

간단하고 아마도 가장 효율적인 솔루션은 동기화 된 블록 내에서 일반의 HashMap을 사용하는 것입니다로 이동합니다. 이 퍼지 스레드가 임계에 남아 있도록 할

Map oldMap; 
synchronized(mapLock) 
{ 
    oldMap = map; 
    map = new HashMap<...>(); 
} 
store(oldMap); 

:

synchronized(mapLock) 
{ 
    map.put(...) 
} 

퍼징 스레드가 단순히 비어있는 새로운 하나를 사용하여지도를 대체 할 수있을 것입니다 다음과 같이 저자는 것 섹션을 최대한 짧게하십시오.

현재이 시나리오에서는 ConcurrentHashMap을 사용하여 얻을 수있는 이점을 볼 수 없습니다. 여러 JMS 스레드가 실행중인 경우에는 다를 수 있습니다.

2

두 번째 스레드가 해시 맵을 원자 적으로 새로운 빈 것으로 대체하고 조금 기다렸다가 이전 데이터의 데이터를 저장할 수 있습니다.

하나의 메시지 처리 시간에 명확한 상한이 없으면 첫 번째 스레드가 맵을 사용하는 동안에는 해당 맵을 잠그도록 "wait bit"를보다 정확하게 만들 수 있습니다. 그런 다음 두 번째 스레드는 내용을 쓰기 전에 잠금을 획득 할 수 있으므로 첫 번째 스레드가 마지막 메시지의 변경 사항을 맵에 쓰는 것이 확실합니다.

0

단순히 해시 맵을 교체하는 방법은 무엇입니까? 그래서 쓰레드 2는 쓰레드 1이 사용하는 해시 맵을 다른 쓰레드로 설정 한 다음 쓰레드 2와 어떤 일을 하든지 시작합니다. 그러면 직렬화를 다룰 필요가 없습니다. so

storemap(){ 
mapcopy=thread1.map; 
thread1.map=new Hashmap<Object>(); 
store(mapcopy); 
} 
+0

ehm ... 예. 그게 내 뜻이야 :) – flup

+0

아아 네 버전을 놓쳤다. – Thijser

관련 문제