¿Por qué la variable ThreadLocal necesita ser estática?

La respuesta a esta pregunta se encuentra en la implementación de ThreadLocal.

Piensa en ThreadLocal como un contenedor

ThreadLocales un contenedor que se mantiene ThreadLocalMapinternamente . Esta ThreadLocalMapes la clave por la que threadlocal debe ser estático (aunque no es necesario, pero la sugerencia es mantenerlo estático).

Porque queremos single container per class, not container per instance.Si tenemos contenedor por ejemplo, vamos a tener tantos contenedores como ejemplo y que se creó pérdida de memoria.

Más detalles aquí

  1. http://www.0xcafefeed.com/2004/06/of-non-static-threadlocals-and-memory/
  2. https://www.appneta.com/blog/introduction-to-javas-threadlocal-storage/
Respuesta 1

No hay una razón inherente por la cual una ThreadLocalvariable debe ser estática. Es solo eso, el problema queThreadLocal resuelve es un problema que generalmente solo ocurre en programas que se basan en ideas de diseño estáticas.

En mi opinión, lo más probable es que encuentre ThreadLocalen el código que originalmente tenía un solo subproceso hasta que alguien lo "actualizó" para usar múltiples subprocesos. El subproceso local es útil cuando un gran cuerpo de código originalmente se refería a alguna variable estática , y ahora necesita que cada subproceso que se ejecuta a través del mismo cuerpo de código tenga su propia copia.

OMI, ThreadLocales un olor a código --- un signo de mal diseño. Un programa bien diseñado y multiproceso no debería necesitarlo.

Respuesta: 2

Estaba haciendo algunos experimentos y accidentalmente escribí un código, que es muy extraño y no lo entiendo todo. Incluso me sorprendió poder compilarlo. Se ve así: enum Foo {VALOR_1 {...

Por favor, consulte el siguiente código. Cuando ejecuto el código, puedo cambiar el valor de una variable final no estática. Pero si trato de cambiar el valor de una variable estática final, arroja java.lang ...

Tengo algunos problemas para encontrar un buen enfoque / implementación usando la API de Stream para lo siguiente: Tengo una lista de elementos, cada elemento que consiste en una cadena y un número entero. Ahora me gusta agrupar ...

Quiero usar una de las tareas de Ant (scp) desde mi código. ¿Hay alguna forma de hacerlo? ¿Debo simplemente hacer referencia a una de las bibliotecas de Ant y llamar a la API directamente desde mi código?