0

JNDI ツリー内のオブジェクトはスレッドセーフになりますか?

たとえば、次のようなことをしたとしましょう。

疑似コード:

String value = null;
try {
  value = context.lookup("someValue")
} catch (Exception ignored) {}
if (value == null) {
  value = "My name is "+currentThread.getName()
  context.bind("someValue", value);
}

ここで、最初のスレッドが someValue をチェックし、それが空であることを確認してから値を設定する可能性がありますが、この時点で別のスレッドが入ってきてチェックし、それも値が空であることが判明したため、独自の値を設定します。最初のスレッドは値をその名前にバインドし、2 番目のスレッドは最初の名前を上書きして独自の名前に再バインドしますか?

または、これをスレッドセーフにする方法はありますか?

4

1 に答える 1

0

カスタム オブジェクト (非 RMI オブジェクト) を WebLogic Server クラスタの JNDI ツリーにバインドすると、そのオブジェクトはクラスタ内のすべてのサーバに複製されます。ただし、ホスト サーバーがダウンすると、カスタム オブジェクトはクラスタの JNDI ツリーから削除されます。カスタム オブジェクトが再度バインドされない限り、カスタム オブジェクトはレプリケートされません。カスタム オブジェクトに加えられた変更を伝達するたびに、カスタム オブジェクトをアンバインドして再バインドする必要があります。

バインド解除と再バインドは、コストのかかる (遅い) 操作です。

ここで詳細情報を参照してください: http://docs.oracle.com/cd/E13222_01/wls/docs81/jndi/jndi.html#475689

コンテキストを使用したスレッドセーフに関する情報もたくさんあります。クラスターごとに 1 回のみの設計パターンを調べる必要があります。

于 2013-08-14T21:37:13.517 に答える