4

次のスレッドセーフでないメソッドを記述する代わりに。

private static final Calendar calendar = Calendar.getInstance();
public void fun() {
    // Going to call mutable methods in calendar.
}

スレッドセーフバージョンに変更します。

public void fun() {
    final Calendar calendar = Calendar.getInstance();
    // Going to call mutable methods in calendar.
}

同じスレッドでも毎回新しいインスタンスを作成する代わりに、私は改善を行いました

public void fun() {
    final Calendar calendar = getCalendar();
    // Going to call mutable methods in calendar.
}

/**
 * Returns thread safe calendar.
 * @return thread safe calendar
 */
public Calendar getCalendar() {
    return calendar.get();
}

private static final ThreadLocal <Calendar> calendar = new ThreadLocal <Calendar>() {
    @Override protected Calendar initialValue() {
        return Calendar.getInstance();
     }
 };

私の3番目のアプローチでは、を呼び出す必要はありますThreadLocal.removeか?

4

2 に答える 2

5

唯一の目的がスレッドセーフにすることである場合、実際にそうする必要はありません。ただし、スレッドがスレッドプールによって維持されていて、スレッドプールから新しく解放された各スレッドに独自の初期値を与えることが目的の場合は、そうする必要があります。

于 2010-08-22T06:12:45.697 に答える
2

@BalusC が言うように、それはあなたが何を心配しているかによって異なります。

スレッド ローカルを使用してオブジェクトをリサイクルすると、Calendar実際にはCalendar.getInstance(). これには、時期尚早のマイクロ最適化の匂いがします。

于 2010-08-22T07:24:26.580 に答える