2 回答

TA貢獻1790條經(jīng)驗 獲得超9個贊
通過假定變量不會被并發(fā)線程修改,Java VM 可以優(yōu)化連續(xù)的、非同步的加載。
如果你想在一個將被另一個線程更改的字段上進行自旋循環(huán),你可以讓虛擬機通過將其標(biāo)記為來確保每次讀取都能看到最新的更改volatile
:
private volatile List<KeyEvent> keyEventQueue;
對 volatile 字段 (§8.3.1.4) 的寫入發(fā)生在對該字段的每次后續(xù)讀取之前。
我不知道你的 V2 是否保證按照 JLS 工作,但System.out
PrintStream
每次寫入時都會同步,從而限制允許 VM 進行的優(yōu)化。

TA貢獻1833條經(jīng)驗 獲得超4個贊
您遇到這種不可預(yù)測的行為的主要原因是因為您實際上創(chuàng)建了一個多線程程序,您在其中從event dispatching thread以外的線程訪問 Swing 組件。
具體行:
MyJFrame terminal = new MyJFrame();
啟動 Swing 事件調(diào)度線程但行(例如):
String keyReleased = terminal.getKeyReleased();
terminal
從主線程訪問(Swing 組件)。
來自Swing 包文檔:
一般來說,Swing 不是線程安全的。除非另有說明,否則所有 Swing 組件和相關(guān)類都必須在事件調(diào)度線程上訪問。
在繼續(xù)嘗試使此代碼工作之前,我建議您閱讀教程課程:Swing 中的并發(fā)。
添加回答
舉報