6

ThreadLocal とその使用に関する次の SO スレッドに関する興味深い議論を既に読みました。

この質問は、設計時の選択に向けられています。私のシナリオはこんな感じです

ほとんどすべてのステップで同じスレッド内で使用する必要がある Web アプリケーションに値オブジェクトがある場合。以下のような2つのインターフェース設計オプションを考えることができます

アプローチ #1メソッド パラメーターの受け渡しを使用します。

ここまでは、値オブジェクト インターフェイスのパラメーターを持つメソッドを持つことができるインターフェイスを考え出すことに集中してきました。

例えば:

public interface SomeDataProcessorInterface {

public void processSomething(SomeValueObjectInterface vo);

}

public interface SomeValueObjectInterface extends Serializable {}

アプローチ #2 ThreadLocal の使用

このアプローチでは、メソッド パラメーターのないインターフェイスを使用し、静的クラスを作成して、スレッドローカルを使用して値オブジェクトにアクセスできます。

例えば:

public interface SomeDataProcessorInterface {

public void processSomething();

}

public interface SomeValueObjectInterface extends Serializable {}

public Class StaticClass {

    private static ThreadLocal<SomeValueObjectInterface> threadLocalVO = new ThreadLocal<SomeValueObjectInterface>();

     public static ThreadLocal getThreadLocal() {
        return threadLocal;
      }

どちらのアプローチが優れていますか? なぜ?

これらの実装のうち、メモリリークの可能性が少ないのはどれですか?

これらの実装のうち、Java ガベージ コレクターに適しているのはどれですか?

他のスレッドのいくつかのポイントを読みましたが、ゼロから始める場合、どのアプローチが優れているかはまだわかりません。

4

3 に答える 3

1

s を使用static TheadLocalすると、要素を削除するのを忘れると、メモリ リークが発生する危険があります。メソッドから戻る前に要素を削除することで、これをいつでも回避できます。このアプローチはお勧めしません。

パラメータはそのメソッド呼び出しに対してのみローカルであるため、最初のアプローチは、現状ではすでにスレッドセーフです。これを使用してください。

于 2013-10-10T21:04:02.900 に答える