私の読んだJLS 12.5は、コードサンプル内のアサーションが決して—をトリガーすべきではないと思うが、私のマルチスレッドのコードでは起こりません。 (JLSは、このセクションでスレッディングを指定していません)。しかし、私の読みが正しいかどうかは、ポイントの横にある。私はこれを常に真実にしたいと思っています。スレッドの存在下でオブジェクトの完全な構成を保証するには
public class MainWindow extends JFrame {
private final JLabel label;
public MainWindow() {
label = new JLabel();
pack();
setVisible(true);
}
public JLabel getLabel() {
Assert.assertNotNull(label);
return label;
}
}
明白な答えは同期ブロックにコンストラクタの内臓を包むようにし、同様に同期ゲッターをマークすることです。 良い方法がありますか?
private MainWindow findMainWindow() {
for (Frame frame : Frame.getFrames()) {
if (frame instanceof MainWindow) {
return (MainWindow)frame;
}
}
return null;
}
は(ところで、私はMac上でJDK6を実行している)
更新:
FWIWは、他のスレッドは、JUnitテスト内でこのコードでウィンドウへの参照を取得しています:
私はそれを同期しようとしましたが、それでも動作しません。
public class MainWindow extends JFrame {
private final JLabel label;
public MainWindow() {
synchronized(this) {
label = new JLabel();
}
}
public synchronized JLabel getLabel() {
Assert.assertNotNull(label);
return label;
}
}
アップデート2:ここでは、コードだ
ここでそれを修正変更です:
private MainWindow findMainWindow() throws Exception {
final AtomicReference<MainWindow> window = new AtomicReference<MainWindow>();
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
for (Frame frame : Frame.getFrames()) {
if (frame instanceof MainWindow) {
window.set((MainWindow) frame);
return;
}
}
}
});
return window.get();
}
を);のsetVisible(true)を'ctorから別のメソッドへ - ' this'は現在他のスレッドにエスケープされているようです。 –
私の更新では、これらのメソッドを削除しました。まだ行きません。 –
は 'Frame.getFrames()'でもEDTの外で呼び出しても安全ですか? – jtahlborn