4

のjavadocによるとThreadLocal、1つ以上のアトミックフィールド用のスレッド固有のコンテナのように聞こえます。

ThreadLocal単一のすべてのアトミックフィールドを表すことを目的としていますか、それとも論理的にグループ化する必要があるThread複数のインスタンスがある場合に便利なコンテナを提供することだけを目的としていますか?Atomic*

ThreadLocalなぜ、たとえば、AtomicLongまたはの代わりに使用したいと思うのだろうかAtomicInteger?前もって感謝します!

4

2 に答える 2

8

目的ThreadLocalは、フィールドがアトミックである必要がないことです。つまり、フィールドの値を集中型メモリと同期する必要はありません。それらはスレッドローカルであり、スレッドローカルメモリストレージにのみ存在します。

たとえば、AtomicLongやAtomicIntegerの代わりにThreadLocalを使用したいのはなぜですか?

ThreadLocal何かのスレッドごとのコピーを保存するのに非常に便利です。たとえば、SimpleDateFormat残念ながら再入可能ではないa。

private final ThreadLocal<DateFormat> threadLocal =
        new ThreadLocal<DateFormat>() {
    @Override
    protected DateFormat initialValue() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS");
    }
};
...
// get one that is per-thread
DateFormat dateFormat = threadLocal.get();

これは便利なパターンです。メモリバリアがある他の不可分操作synchronizeについて心配する必要がないからです。volatile

于 2012-04-27T20:20:38.610 に答える
2

たとえば、AtomicLongやAtomicIntegerの代わりにThreadLocalを使用したいのはなぜだろうと思いますか?

それらは完全に異なる目的を果たします。ThreadLocalつまり、各スレッドにオブジェクトの独自のコピーを付与することで、同期について心配する必要がありません。したがって、に格納されているオブジェクトには、ThreadLocal複数のスレッドからアクセスできない可能性があります。

Atomic*また、同期について心配する必要はありませんが、スレッド間で共有することを特に目的としています。

于 2012-04-27T20:23:21.197 に答える