2011-08-01 3 views
0

그냥 뭔가에 대한 몇 가지 확인 추구 :자바 동기화 문제

내가 스윙 GUI와 서버 개체가를 외부 스레드에 의해 액세스하는 방법 handle()를 포함하고, 서버 개체의에서 실행되는 다른 방법 doThis(), GUI.

스윙 이벤트 처리는 이벤트 발송 스레드에서 발생하므로 실제로는 doThis()에 액세스하는 이벤트 발송 스레드라는 것을 알고 있습니다.

doThis()handle()이 간섭을 일으킬 수 있습니다. 이를 방지하려면 두 방법을 모두 동기화해야합니다. 이렇게하면 이벤트 발송 스레드와 다른 외부 스레드가 다른 스레드가 완료되기 전에 하나의 메소드를 호출하는 것을 방지 할 수 있습니다.

제 생각은 정확합니까? the Java tutorial on synchronization 가입일

답변

0

: 첫째, 인터리빙 같은 동기화 객체 메소드 호출에 두 불가능 : 동기화 이들 방법을

두 효과를 갖는다. 한 스레드가 객체에 대해 동기화 된 메소드를 실행할 때 첫 번째 스레드가 객체로 완료 될 때까지 동일한 객체 블록 (실행 중단)에 대해 동기화 된 메소드를 호출하는 다른 모든 스레드. 두 번째, 동기화 된 메서드가 종료되면 동일한 개체에 대한 동기화 된 메서드의 후속 호출과 함께 자동적으로 happen-before 관계를 설정합니다. 이렇게하면 모든 스레드에서 객체 상태에 대한 변경 사항을 볼 수 있습니다.

그렇습니다.

+0

그 자체로는 Swing GUI에서 [생동력] (http://download.oracle.com/javase/tutorial/essential/concurrency/liveness.html)을 유지하기에 충분하지 않을 수 있습니다. – trashgod

1

대신 SwingWorker; TwoRoot은 간단한 예입니다. 백그라운드에 handle()을 넣고 을 process()에 넣습니다.