2013-10-23 3 views
0

GUI 로그에서 ConcurrentModificationException 예외가 발견되었습니다. 이는 테이블 모델을 지원하는 목록을 변경하는 것과 관련이있는 것 같습니다.Java Swing/EDT 이벤트 처리 동기화

순서는 것 같다 :

  1. 합니다 Event1 목록을 변경하면 목록
  2. 의 백업 목록 반복 및 변질을 유발 현재 실행합니다 (변화의 부산물 이벤트를) 중단 event2를 트리거합니다. 이 이벤트는 event1 처리 전에 처리됩니다.
  3. event2도 목록을 변경합니다.
  4. 합니다 Event1는 것, 제어를 가져오고 백업 목록이

를 변경 되었기 때문에 나는 두 곳 모두에서 동기화 된 키워드 (또는 잠금)을 사용하는 경우 그들은 모두, 동부 서머 타임에 있기 때문에 불면의 반복을 계속 event2 포기하고 event1 처리를 계속하게하거나 멋진 교착 상태를 만들었습니까?

+0

새로운 데드락을 만들지 않았습니다. 더티 읽기 (dirty read)라고 불리우며 꽤 유명합니다. –

답변

2

테이블 모델을 백업하는 것과 관련된 것으로 보입니다.

목록을 변경하면 안됩니다. 모든 업데이트는 모델에서 직접 수행해야합니다.

많은 경우 ConcurrentModificationExecption을 사용하면 해당 코드를 SwingUtilities.invokeLater()로 래핑 할 수 있으므로 코드가 EDT의 끝에 추가되어 첫 번째 이벤트가 처리를 완료 할 수 있습니다.

+0

그래서 동기화/잠금으로 인해 교착 상태가 발생합니까? – rediVider

+0

@rediVider : EDT를 차단할 가능성이 높습니다. 'invokeLater()'를 사용하면'Runnable'을 큐에 넣을 것이고, "모든 보류중인 이벤트가 처리 된 후에 발생합니다." – trashgod