我來到acrosss同樣的問題,在這裏看到的答案後,我決定使用一種混合的方法:
public class PersistentThreadLocal<T> extends ThreadLocal<T> {
final Map<Thread, T> allValues;
final Supplier<? extends T> valueGetter;
public PersistentThreadLocal(Supplier<? extends T> initialValue) {
this(0, initialValue);
}
public PersistentThreadLocal(int numThreads, Supplier<? extends T> initialValue) {
allValues = Collections.synchronizedMap(
numThreads > 0 ? new WeakHashMap<>(numThreads) : new WeakHashMap<>()
);
valueGetter = initialValue;
}
@Override
protected T initialValue() {
T value = valueGetter != null ? valueGetter.get() : super.initialValue();
allValues.put(Thread.currentThread(), value);
return value;
}
@Override
public void set(T value) {
super.set(value);
allValues.put(Thread.currentThread(), value);
}
@Override
public void remove() {
super.remove();
allValues.remove(Thread.currentThread());
}
public Collection<T> getAll() {
return allValues.values();
}
public void clear() {
allValues.clear();
}
}
編輯:如果你打算用ThreadPoolExecutor的使用中,WeakHashMap
更改爲常規HashMap
,否則會發生奇怪的事情!
也許更有趣的問題是,你爲什麼要這麼做? – 2010-05-08 20:09:38
好吧,這個想法無論好壞,都有辦法收集多個線程中的更改列表,然後每隔一段時間執行一次所有更改。它看起來像是一種避免同步的自然方式,因爲這些更改僅針對特定的線程進行排序。 – 2010-05-08 20:16:45
查看[我的答案](http://stackoverflow.com/a/15654081/113632)給相關的問題;如果您需要訪問'ThreadLocal'中的所有值,則根本不需要'ThreadLocal'。通常,你需要一個'ConcurrentHashMap'。 –
dimo414
2015-08-17 15:48:57