첫 번째 스레드는 주제를 수신하는 JMS 구독자입니다. 메시지를 받으면 해시 맵에 항목을 추가/업데이트/삭제합니다. 다른 스레드는 TimerClass를 사용하여 매 2 분마다 실행되고 동일한 해시 맵의 내용을 읽고이를 파일에 저장하고 해시 맵을 지 웁니다. 어떤 종류의 hashmap- 동시 또는 동기화를 사용해야하는지 제안하십시오. 이것을 달성하는 다른 방법이 있습니까?동일한 해시 맵에 액세스하는 두 개의 스레드가 하나의 스레드가 2 분 후 다른 실행을 계속 실행 중이고 해시 맵을 지우는 방법, Java에서이를 처리하는 방법
답변
동기화가 필요합니다. HashMap
은 동기화되지 않으므로.
사용 Collections.SynchronizedMap
또는 Hashtable
그냥 내 의심을 취소하려면 collections.SynchornizedMap을 사용하는 경우 모든 호출을 넣을 필요가 있습니다, 넣어, 동기화 된 블록에 명확한 방법? 동기화 됨 (지도) {}. 또한 내가 Hashtable을 사용한다면 나는 동기화를 취할 필요가 없다. – Yamini
(BTW Hashtable이 동기화 됨) 더 많은 HashMap 작업을 10k/초 이상 호출하지 않으면 Hashtable을 사용하는 것이 좋습니다. 코드를 변경하지 않아도됩니다. 빠른 n 쉬운. –
간단하고 아마도 가장 효율적인 솔루션은 동기화 된 블록 내에서 일반의 HashMap을 사용하는 것입니다로 이동합니다. 이 퍼지 스레드가 임계에 남아 있도록 할
Map oldMap;
synchronized(mapLock)
{
oldMap = map;
map = new HashMap<...>();
}
store(oldMap);
:
synchronized(mapLock)
{
map.put(...)
}
퍼징 스레드가 단순히 비어있는 새로운 하나를 사용하여지도를 대체 할 수있을 것입니다 다음과 같이 저자는 것 섹션을 최대한 짧게하십시오.
현재이 시나리오에서는 ConcurrentHashMap을 사용하여 얻을 수있는 이점을 볼 수 없습니다. 여러 JMS 스레드가 실행중인 경우에는 다를 수 있습니다.
두 번째 스레드가 해시 맵을 원자 적으로 새로운 빈 것으로 대체하고 조금 기다렸다가 이전 데이터의 데이터를 저장할 수 있습니다.
하나의 메시지 처리 시간에 명확한 상한이 없으면 첫 번째 스레드가 맵을 사용하는 동안에는 해당 맵을 잠그도록 "wait bit"를보다 정확하게 만들 수 있습니다. 그런 다음 두 번째 스레드는 내용을 쓰기 전에 잠금을 획득 할 수 있으므로 첫 번째 스레드가 마지막 메시지의 변경 사항을 맵에 쓰는 것이 확실합니다.
솔루션을 제안하기가 어렵습니다. 동기화 수준은 다른 요구 사항에 크게 의존합니다. – Jan
HashMap을 동기화하는 것이 좋습니다 – Sach
내 코드는 기본적으로 하나의 hashmap을 가지며 그 내용은 첫 번째 thead가 추가/업데이트합니다. 내가 물어보고 싶은 것은 동일한 해시 맵을 읽고 2 분 후에 실행되는 두 번째 스레드가 계속 실행중인 첫 번째 스레드의 영향을 받습니까? 그것을 지우려고하는 동안 wriiten되었을 수도 hashmap의 일부 내용을 잃는 possiblity인가? – Yamini