相關代碼here科特林,競爭條件問題
從本質上講,我們有兩個線程,一個領導,保持呼叫display()
和另外一個,大約需要用戶輸入照顧渲染,調用相應的mouse or key event相應
Viewpole和object極點不是別的幫助類,以便於相機和對象的矩陣處理。
他們的方法都是從display()
和用戶輸入法調用的。
display()
同時呼籲viewpole.calcMatrix()
和objectpole.calcMatrix()
而輸入線程調用他們間接地,例如basicLighting.mouseDragged()
- >objectpole.mouseDragged()
- >rotateView()
- >calcMatrix()
競爭狀態開始流行起來,當我開始使用pool objects減少GC在特定情況下的壓力。我查了幾十次,每個對象只用了一次(除了用when
)。
我通過打印出view matrix每個display()
調用來檢測競爭狀態。每當它不同時,就意味着我得到了一個。示例here。
調查中,我發現使用簡單的println
,例如,Viewpole.calcMatrix()
有時會在另一個調用完成之前被調用以完全執行它。
在calcMatrix()
(viewpole和objectpole)上加上@Synchronized
減少了很多,我說80/90%。
但是,有時候,我還是經歷了比賽條件。我試圖synchronize(lock){}
還每個電話用戶輸入的線程,就像here:
val lock = Any()
override fun mousePressed(e: MouseEvent) {
synchronized(lock) {
viewPole.mousePressed(e)
objectPole.mousePressed(e)
}
}
它並沒有幫助。
我在做什麼錯?什麼是正確的方式來實現我的情況下的同步?也就是說,兩個線程調用同一個類。