threadlocal ejemplo java thread-local static-block

ejemplo - threadlocal java 8



Cómo inicializar objetos ThreadLocal en Java (3)

La respuesta aceptada está desactualizada en JDK8. Esta es la mejor manera desde entonces:

private static final ThreadLocal<List<Foo>> A_LIST = ThreadLocal.withInitial(ArrayList::new);

Tengo un problema en el que estoy creando un ThreadLocal e inicializándolo con el nuevo ThreadLocal. El problema es que, en realidad, solo quiero una lista persistente que dure la vida del hilo, pero no sé si hay una manera de inicializar algo por hilo en Java.

Por ejemplo, lo que quiero es algo como:

ThreadLocal static { myThreadLocalVariable.set(new ArrayList<Whatever>()); }

Para que se inicialice para cada hilo. Sé que puedo hacerlo:

private static Whatever getMyVariable() { Whatever w = myThreadLocalVariable.get(); if(w == null) { w = new ArrayList<Whatever>(); myThreadLocalVariable.set(w); } return w; }

pero realmente preferiría no tener que verificar eso cada vez que se usa. ¿Hay algo mejor que pueda hacer aquí?


Simplemente anula el método initialValue() :

private static ThreadLocal<List<String>> myThreadLocal = new ThreadLocal<List<String>>() { @Override public List<String> initialValue() { return new ArrayList<String>(); } };


Tu solución está bien. Un poco de simplificación:

private static Whatever getMyVariable() { Whatever w = myThreadLocalVariable.get(); if(w == null) myThreadLocalVariable.set(w=new Whatever()); return w; }

En Java 8, somos capaces de hacer:

ThreadLocal<ArrayList<Whatever>> myThreadLocal = ThreadLocal.withInitial(ArrayList::new);

que utiliza la interfaz funcional Supplier<T> del Supplier<T> .