0

가 빠른 동기화 질문이 있으십니까, 여기에 내가 무엇을 가지고구축이 발생-하기 전에 배열에

ConcurrentMap<String, int[][]> map = new ConcurrentHashMap<String, int[][]>(); 

B) Class2의에는 스레드 1이라는 스레드가 있습니다. Thread1은 Id을 만들고 지도에 해당하는지 확인합니다. 이 경우 값 (int [] [])을 검색하고 내용을 수정하여 다시 넣습니다. 그렇지 않으면 새로운 int [] []를 만들고 저장합니다. 이 check-> modify/create 프로세스는 자주 발생합니다.

private class Thread1 implements Runnable{ 

      public void run(){ 
       //keepRunning is volatile 
       while(keepRunning){ 

        String id  = "ItemA"; 
        int[][] value = map.get(id); 

        //If value is null, create an int[][] and put it back as value for Id 
        //If value is not null, modify the contents according to some logic 
       } 
      } 
    } 

c)는 마지막으로, 나는 Thread2라는 또 다른 스레드를 보유하고 있습니다. 이 쓰레드는 id를 취하여 맵에 값이 있는지 확인합니다. 그렇지 않으면 아무 일도 일어나지 않습니다. 그럴 경우 int [] []의 값을 합계하고 계산을 위해 숫자를 사용합니다 (여기서는 수정하지 않음).

내 작업이 원 자성인지 알아 내려고하고 있습니다. b)의 ​​연산은 배열의 생성/수정과 맵에 대한 삽입이 하나의 스레드 (스레드 1)에만 국한됩니다.

또한 맵에 삽입하면 발생하기 전에 조치가 설정되므로 c)는 int [] []에서 업데이트 된 값을 볼 수 있습니다.

그러나 Thread2가지도에서 동일한 int [] []를 찾고 Thread1이 스레드를 수정하는 동안 그것을 요약하려고하면 어떤 일이 발생할지 너무 확신하지 않습니다.

Thread2가 int [] []에서 이전 (단절되지 않은) 값을 볼 것이라는 점을 수정했습니다. 이유는 Thread1이 값을 다시 맵에 넣기 전까지는 새로운 수정이 Thread2에 표시되지 않기 때문입니다.

대단히 감사합니다.

+0

Producer/Consmer 패턴 구현을 시도하는 것처럼 들리면 http://docs.oracle.com/javase/tutorial/essential/을 참고하십시오. concurrency/guardmeth.html 더 많은 아이디어가 있습니다 – MadProgrammer

답변

1

당신의 작업은 원자가 아니며, 스레드 2는 스레드 1이 값을 수정하는 동안 값을 합산하려고 시도 할 것입니다.

원본을 복제해야하는 것을 피하려면 복제본을 수정하고 복사본을 다시 넣어야합니다.

+0

안녕하세요 Tom, thanks. 또는 a) AtomicReferenceArray를 사용할 수 없습니까? b) b)에서 새 배열을 만들고 (예 : 맵에서 이전 배열을 가져 오는 대신) 특정 ID에 대해 맵을 업데이트 할 수 있습니까? – CaptainHastings

관련 문제