2013-02-08 2 views
1

내가 가진 :동기화 중에 Java 수신기가 대기 또는 드롭됩니까? 이벤트 리스너에서

public void keyPressed(KeyEvent e) { //the same logic for mouse events, etc. 
    synchronized(lockFoo) {...} 
} 

그리고 다른 곳 코드에서 다른 스레드 : lockFoo가 잠겨있는 동안

public void bar() { 
    synchronized(lockFoo) {...} 
} 

만약 이상의 이벤트가 화재가 것이다 FIFO 큐는 그들의 턴을 기다리거나 떨어 뜨릴 것인가? FIFO Cuing이 더 바람직한 동작입니다.

+1

스레드 테스트 케이스를 만드는 것은 거의 재미 없지만 예상 한 결과를 얻지 못하면 직접 시도해 보지 않으려면 설명을 요청하십시오. –

+0

내 머리 꼭대기에서 모니터 잠금을 얻으려는 모든 스레드는 잠금이 해제 될 때까지 대기합니다. 잠긴 상태에서 대기중인 스레드는 절전 모드로 들어가서 처리를 중지합니다. 이로 인해 들어오는 이벤트는 버려 질 수 있지만 시스템에 따라 다릅니다. – MadProgrammer

+0

@ - A - C : 그렇게하면 "거의 항상"과 "항상"가 구별되지 않습니다. –

답변

2

FIFO를 사용하려는 경우 공정한 생성자 인수가 "true"로 설정된 ReentrantLock을 사용하십시오. 일반적인 동기화에서는 전혀 불가능합니다.

+0

감사합니다. 그러나 일부 코드를 표시하는 데 도움이됩니다. –

+1

https://gist.github.com/jdevelop/4740621 – jdevelop

0

그들은 차례를 기다리고 결국 예측할 수없는 순서로 실행됩니다 (엄격한 FIFO는 없습니다).

0

스레드는 확실히 대기열에 있지만, 순서는 Thread Priority에 따라 다르며, 그렇지 않은 경우 무작위입니다. FIFO 보증은 없습니다.