첫 번째 스레드는 주제를 수신하는 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"를보다 정확하게 만들 수 있습니다. 그런 다음 두 번째 스레드는 내용을 쓰기 전에 잠금을 획득 할 수 있으므로 첫 번째 스레드가 마지막 메시지의 변경 사항을 맵에 쓰는 것이 확실합니다.
- 1. 하나의 해시 맵에 2 개의 반복자를 설정하는 방법
- 2. 두 개의 스레드가 동일한 해시 맵에 동일한 키 값을 넣으려고 할 때 어떤 일이 발생합니까?
- 3. 자바에서 두 개의 해시 맵을 비교하는 방법
- 4. Java 스레딩 - 작업자 스레드가 해당 보스의 해시 맵을 변경합니다.
- 5. 두 개의 스레드가 하나의 동기화 방법 scjp
- 6. 스레드가 계속 순환하도록하는 방법
- 7. 두 개의 해시 맵을 비교하여 제거하고 싶습니다.
- 8. 자바 - 해시 맵 목록의 해시 맵을 반복 처리하는 방법
- 9. java 중복 된 항목없이 두 개의 해시 맵을 결합하는 방법
- 10. 해시 맵을 사용하여 동일한 코드를 작성하는 방법
- 11. java의 스레드가 실행 중이고 스레드 소유권이 없다면 스레드가 가비지 수집됩니까
- 12. 동시 해시 맵에 삽입
- 13. 배열에서 해시 맵을 채우는 방법
- 14. 동일한 ArrayList에 동시에 액세스하는 두 개의 스레드가 있습니까?
- 15. 스레드가 실행 완료되었는지 확인하는 방법
- 16. Windows : 메시지를 처리하는 두 개의 스레드가 있습니까?
- 17. 다른 스레드가 MemoryStream에 액세스하는 중
- 18. 해시 맵에 n 개의 최대 값을 찾기
- 19. 조합법 : 두 스레드가 액세스하는 변수
- 20. 고유 키와 관련하여 해시 맵에 여러 값을 저장하는 방법
- 21. 모든 스레드가 실행을 마친 후 메시지 상자를 표시하는 방법?
- 22. 스레드가 액세스하는 페이지를 찾으십시오.
- 23. 동일한 해시, 다른 동작
- 24. 자식 스레드가 시작된 후에 만 주 스레드가 계속 실행되도록하려면 어떻게해야합니까?
- 25. Java 초보자 : SortedSet 항목의 해시 맵에 액세스하는 방법?
- 26. 파이썬 : 두 스레드가 완료 될 때까지 함수의 실행을 멈추는 방법
- 27. 작업 스레드가 차단되었는지 확인하는 방법
- 28. 2 개의 스레드가 사용하는 변수를 처리하는 방법은 무엇입니까?
- 29. 하나의 스레드가 실행을 완료 한 후 android에서 스레드를 실행하십시오.
- 30. 글로벌 해시 테이블에 액세스하는 방법 "회피"잠금
솔루션을 제안하기가 어렵습니다. 동기화 수준은 다른 요구 사항에 크게 의존합니다. – Jan
HashMap을 동기화하는 것이 좋습니다 – Sach
내 코드는 기본적으로 하나의 hashmap을 가지며 그 내용은 첫 번째 thead가 추가/업데이트합니다. 내가 물어보고 싶은 것은 동일한 해시 맵을 읽고 2 분 후에 실행되는 두 번째 스레드가 계속 실행중인 첫 번째 스레드의 영향을 받습니까? 그것을 지우려고하는 동안 wriiten되었을 수도 hashmap의 일부 내용을 잃는 possiblity인가? – Yamini