Есть ли какая-то польза от размещения объекта ThreadSafe в ThreadLocal? - PullRequest
6 голосов
/ 26 июня 2011

Недавно я увидел фрагмент кода, который использовал объект ThreadLocal и держал в нем ConcurrentHashMap.

Есть ли в этом какая-то логика / выгода или это избыточно?

Ответы [ 3 ]

7 голосов
/ 26 июня 2011

Если ссылка only на одновременную хэш-карту находится в ThreadLocal, хеш-карта, очевидно, ссылается только из одного потока. В таком случае я бы сказал, что это полностью избыточно.

Однако нетрудно представить, что кто-то «делится» локально хранящимся в потоке хеш-картой с другими потоками:

ThreadLocal<ConcurrentHashMap<String, String>> tl = ...

// ...

final ConcurrentHashMap<String, String> props = tl.get();

EventQueue.invokeLater(new Runnable() {
    public void run() {
        props.add(key.getText(), val.getText());
    }
});
0 голосов
/ 26 июня 2011

В дополнение к тому, что сказал @aioobe, рассмотрим случай InheritableThreadLocal, в котором значение local передается из потока в каждый дочерний поток, который он создает.

И, как говорит @pst, ничто не мешает использовать одно и то же значение в разных (не наследуемых) ThreadLocal с.

Короче говоря, вы должны провести тщательный анализ локальных потоков, способа их инициализации и способа их использования, прежде чем вы сможете безопасно заключить, что они не должны быть безопасными для потоков.

0 голосов
/ 26 июня 2011

Либо он использовал ThreadLocal неправильно, либо ConcurrentHashMap неправильно. Вероятность того, что комбинация имеет смысл, близка к 0.

...