>

면접에서 질문을 받았습니다 .. 다음과 같이 맵에 값을 저장하려면 다음을 수행하십시오.

key_1 --> value 1
key_2 --> value 2
key_1 --> value 3

여기서 키와 값이 모두 문자열에 있다고 가정하면 다음과 같이 맵을 가져와야합니다.

Map<String,List<String>> m1 = new HashMap();

그러면 나사산 안전을 원하는지 어떻게 물었습니까? 그런 다음이 목적으로ConcurrentHashMap을 사용할 수 있다고 말했습니다.

그런 다음 그들은 가치가 있습니다 목록은 스레드 안전하다는 것을 의미합니까? 전의.

t1.get("key_1").put("value_4");    
t2.get("key_1").put("value_5");

여기서, 스레드 t1과 t2가 동시에 실행되고 있다고 가정합니다. 그래서 그 List<String>  ConcurrentHashMap내부의 값은 Thread-Safe입니까? 그렇다면 어떻게? 그리고 만약 그렇지 않다면 그것을 달성하는 방법 ??

  • 답변 # 1

    ConcurrentHashMap  스레드 안전 데이터 구조입니다. List<String> 를 사용하는 경우 ConcurrentHashMap 값에서 (스레드 안전하지 않음)  그런 다음 List  두 스레드가 목록의 참조를 안전하게 보호하고 나중에 병렬로 수정할 수 있기 때문에 스레드로부터 안전하지 않습니다.

    ConcurrentHashMap  스레드 안전은 put 와 같은 작업을 의미합니다.  그리고 putAll  e.t.c는 스레드로부터 안전합니다. 값으로 사용하는 데이터 구조가 스레드로부터 안전하다는 의미는 아닙니다.

    그것을 달성하는 방법?

    스레드 안전 List<String> 사용   CopyOnWriteArrayList 처럼   당신의 ConcurrentHashMap 의 가치로 .

    List 를 사용자 정의합니다  그들의 모든 방법을 Synchronized .

    스레드가 아닌 안전 List 변환  안전한 List 스레드   Collections.synchronizedList(non-Thread safelist) 를 통과함으로써 .

  • 답변 # 2

    I said we can take ConcurrentHashMap for this purpose..they said ok..

    아마 괜찮을 수도 있습니다. key_1과 key_2 사이에 특별한 관계가 있는지 여부에 따라 다릅니다.

    하나의 스레드가 key_1에 대한 새 값을 저장 한 다음 key_2에 대한 관련 값을 저장하기 직전에 시간 조각이 종료되도록합니다. 그런 다음 다른 스레드는 첫 번째 스레드가 일시 중단 된 동안 key_1 및 key_2의 값을 검사합니다. key_1의 새 값을 볼 수 있지만 key_2의이전값을 볼 수 있습니다

    이 시점에서 첫 번째 스레드가 두 키 업데이트 중 절반 만 완료 되었습니까?

    ConcurrentHashMap 에 연결  멀티 스레드 응용 프로그램에서 맵 데이터 구조 자체가 재미 있거나 잘못된 일을하지 않도록하지만 응용 프로그램이 항상 함께 업데이트되는 두 키에 의존하는 경우 여전히 명시적인 잠금이 필요합니다. 항상 함께 업데이트되도록합니다.

  • 이전 python - Tensorflow를 사용하여 RUC 및 LSTM 모델에 대해 AUC를 계산하고 ROC 곡선을 생성하는 방법은 무엇입니까?
  • 다음 bash - 파일을 특정 폴더로 이동