다음은 몇 가지 의사 코드입니다.동시 수정 예외를 방지하는 가장 좋은 방법
public class MyObject
{
private List<Object> someStuff;
private Timer timer;
public MyObject()
{
someStuff = new ArrayList<Object>();
timer = new Timer(new TimerTask(){
public void run()
{
for(Object o : someStuff)
{
//do some more stuff involving add and removes possibly
}
}
}, 0, 60*1000);
}
public List<Object> getSomeStuff()
{
return this.someStuff;
}
}
그래서 본질적 문제는 코드에없는 다른 개체 위의 읽기 전용 목적을 위해 목록을 가져올 수() getSomeStuff를 호출 할 것입니다. 이 경우 타이머 스레드에서 concurrentmodificationexception이 발생합니다. getSomeStuff 메서드를 동기화하려고 시도하고 심지어 타이머 스레드에서 동기화 된 블록을 시도했지만 여전히 오류가 계속 발생했습니다. 목록의 동시 액세스를 중지하는 가장 쉬운 방법은 무엇입니까?
그러나 스레드 (추가 및 제거)에서 수행 된 작업은 실제로 목록 개체에서 유지되어야합니다. 다른 스레드가 읽기 전용 (foreach 루프)으로 목록에 액세스하여 JVM을 괴롭히는 것을 원하지 않습니다. – thatidiotguy
확인, 목록에 대한 삭제/반복에 관한 업데이트를 참조하십시오. –
자바의 동기화 키워드로 뭔가를하는 것이 가능했을 것이라고 생각하지만, 그렇지 않다고 말하는 것입니까? 그리고 이러한 Lock 및 ReadWriteLock 패키지는 무엇입니까? 또한 타이머의 run 메서드가 실행되는 동안 목록 자체를 잠글 필요가 있습니다.이 방법을 사용하는 것이 좋습니다? – thatidiotguy