가 빠른 동기화 질문이 있으십니까, 여기에 내가 무엇을 가지고구축이 발생-하기 전에 배열에
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에 표시되지 않기 때문입니다.
대단히 감사합니다.
Producer/Consmer 패턴 구현을 시도하는 것처럼 들리면 http://docs.oracle.com/javase/tutorial/essential/을 참고하십시오. concurrency/guardmeth.html 더 많은 아이디어가 있습니다 – MadProgrammer