Pregunta ¿Cuál es el equivalente de Java de C # "Contexto de llamadas lógicas"


En .net, hay un "uber" thread-local-storage (TLS) que permite que los datos arbitrarios de TLS "salten" de un hilo a otro automáticamente. Se basa en el Clase CallContext.

En otras palabras, una solicitud lógica puede engendrar una jerarquía de nuevos hilos, y cada uno de esos hilos tendrá acceso al mismo TLS del hilo original. Es una característica muy poderosa, particularmente para las preocupaciones de registro, autorización, multi-tenencia o marca.

¿Cuál es el equivalente en Java?

Solo en .net 4.5 tiene el "contexto lógico de llamada" obtenido una capacidad de "copia al escribir" que permite a los hilos hacer modificaciones privadas al contexto lógico de llamada. En otras palabras, .net aún está madurando esta capacidad y brindando mayor estabilidad.

Si Java tiene una noción equivalente, ¿qué tan estable es? ¿Qué problemas tiene?

Aclaración

Ya sé que Java tiene una capacidad de almacenamiento local de hilos (TLS). Esa no es la pregunta. Me pregunto si Java tiene un equivalente del .NET "contexto de llamada lógica", que es una construcción mucho más poderosa que el simple TLS.


32
2018-06-24 19:32


origen


Respuestas:


Tal vez InheritableThreadLocal es lo que estás buscando?

No estoy seguro de si es exactamente igual, pero por lo que yo entiendo cumple este requisito:

una solicitud lógica puede engendrar una jerarquía de nuevos hilos, y cada uno de esos hilos tendrá acceso al mismo TLS del hilo original.

De los documentos

Esta clase amplía ThreadLocal para proporcionar herencia de valores desde el subproceso principal al subproceso secundario: cuando se crea un subproceso secundario, el niño recibe valores iniciales para todas las variables heredables locales heredadas para las cuales el principal tiene valores. Normalmente los valores del niño serán idénticos a los del padre; sin embargo, el valor del niño puede convertirse en una función arbitraria de los padres anulando el método childValue en esta clase.   Las variables locales heredables se utilizan con preferencia a las variables locales locales cuando el atributo por subproceso que se mantiene en la variable (por ejemplo, ID de usuario, ID de transacción) se debe transmitir automáticamente a cualquier subproceso secundario que se cree.

No sé sobre la capacidad de "copiar al escribir" que mencionaste, pero creo que puedes anular InheritableThreadLocal.childValue(T) Proxy el valor del padre para que las escrituras no pasen al padre y modifiquen el almacenamiento local del hilo actual


15
2017-07-09 06:26



No estoy familiarizado con .net pero de su descripción lo más cercano que pude pensar fue una ThreadLocal.

Sin embargo, encontré un artículo que podría ser útil.

https://dzone.com/articles/thread-local-storage-java


-3
2017-07-04 08:40