동일한 개체를 수정하는 두 개의 스레드가 있고 MyObject라고 말하면 개체를 동기화했습니다. 그러나 스레드 중 하나에서 다른 객체가 수정되어 MyObject를 호출해야합니다.자바에서 스레드 동기화
e.e.
public void run(){
synchronized(MyObject){
...
anotherObject.modify();//<----calls MyObject
...
}
}
이로 인해 ConcurrentModificationExceptions이 발생합니다. 이 문제를 해결하는 방법을 모르겠습니다. 동기화하지 않으면 두 스레드가 MyObject를 호출 할 때 예외가 발생합니다. 이 문제를 어떻게 해결할 수 있습니까?
업데이트 : 코드는 Android 기기 용입니다. 이전에는 언급하지 않았습니다. Android 관련 특정 객체가 없기 때문입니다. 47 : 43.660 : ERROR/AndroidRuntime (5258)는 처리되지 않는 처리기 47 : 출사 메인 쓰레드 의한 캐치되지 않는 예외 02-03 02 로그 캣 출력
02-03 02 매우 유용하지 않다 43.670 : 오류/AndroidRuntime (5258) : java.util.ConcurrentModificationException 02-03 02 : 47 : 43.670 : ERROR/AndroidRuntime (5258) : java.util.AbstractList에서 $ SimpleListIterator.next (AbstractList.java:64) 02- 03 02 : 47 : 43.670 : ERROR/AndroidRuntime (5258) : com.jjg.myapp.gameunit.findEnemy (MoveableUnit.java:656) // < ---이 방법에서 Gamestate의 컬렉션은 02-03 02을 통해 반복됩니다. : 47 : 43.670 : ERROR/AndroidRuntime (5258) : com.jjg.myapp.gameunit.update (GameUnit.java:416)에서
내가 동기화하려고했던 대상은 본질적으로 gs라는 GameState입니다. 그것은 ArrayLists, 배열 및 다른 객체의 구색을 수용합니다. gs는 정적이 아닙니다.
문제가 발생하는 경우 위의 방법은 다음과 같습니다
for(GameUnit gu : this.getBase().getGameState().getAllUnits()){//<---this is the problem line.
//do some stuff...
}
getAllUnits는 GameUnits의 ArrayList를 반환 (메소드를 호출 GameUnit를 포함하여 - 어떤 물체가 삭제되거나 만들어지면 내가 반복자를 필요가 없습니다).
실제 코드와 예외 스택 추적을 표시하십시오. ConcurrentModificationException은 다중 스레드와 아무 관련이 없습니다. –
귀하의 상황과 관련된 구체적인 조언을 제공 하기엔 너무 세세한 부분이 있습니다. 실제 코드를 보여주십시오. – NPE
업데이트했습니다. 업데이트 된 정보가 유용하길 바란다. –