Java 1.4 API を使用したXletの開発に携わっています。
ドキュメントによると、Xlet
インターフェイス メソッド (実際には xlet ライフサイクル メソッド) は、その特別なスレッド (EDT スレッドではありません) で呼び出されます。ログで確認しました-これは本当です。EDT でライフサイクル メソッドが呼び出される BB/Android フレームワークとは異なるため、これは私にとっては少し意外ですが、今のところ問題ありません。
プロジェクト コードでは、アプリが広範囲に呼び出しを使用していることがわかります (これは、EDT スレッドDisplay.getInstance().callSerially(Runnable task)
で実行する LWUIT の方法です)。Runnable
したがって、基本的に、Xlet 実装クラス内のコードの一部は、EDT スレッドから xlet 内部状態オブジェクトの作成/更新/読み取り操作を実行し、他の一部のコードは、同期なしでライフサイクル スレッドから実行します (状態変数が同期されていないことを含む)。 volatile として宣言されています)。次のようにします。
class MyXlet implements Xlet {
Map state = new HashMap();
public void initXlet(XletContext context) throws XletStateChangeException {
state.put("foo", "bar"); // does not run on the EDT thread
Display.getInstance().callSerially(new Runnable() {
public void run() {
// runs on the EDT thread
Object foo = state.get("foo");
// branch logic depending on the got foo
}
});
}
..
}
私の質問は次のとおりです。これにより、まれな並行性の問題の背景が作成されますか? 状態へのアクセスを明示的に同期する必要がありますか (または、少なくとも状態を揮発性として宣言する必要があります)?
私の推測では、コードがマルチコア CPU で実行されるかどうかによって異なります。マルチコア CPU では、2 つのスレッドが独自のコアで実行されている場合、変数がキャッシュされるため、各スレッドが明示的に同期されない限り、状態の独自のバージョン。
私の懸念に対して信頼できる回答を得たいと思います。