Red de conocimiento informático - Problemas con los teléfonos móviles - La diferencia entre las variables locales de subprocesos compartidos ThreadLocal y el mecanismo de sincronización de subprocesos

La diferencia entre las variables locales de subprocesos compartidos ThreadLocal y el mecanismo de sincronización de subprocesos

ThreadLocal es una buena idea para resolver el problema de seguridad de subprocesos al proporcionar a cada subproceso una copia independiente de la variable para resolver el conflicto del acceso concurrente a la variable. En muchos casos, ThreadLocal es más simple y conveniente que utilizar directamente el mecanismo de sincronización sincronizada para resolver problemas de seguridad de subprocesos, y el programa generado tiene una mayor concurrencia.

Para problemas de intercambio de recursos de múltiples subprocesos, el mecanismo de sincronización adopta el método de "intercambiar tiempo por espacio", mientras que ThreadLocal adopta el método de "intercambiar espacio por tiempo". El primero solo proporciona una variable para que diferentes subprocesos se pongan en cola para acceder, mientras que el segundo proporciona una variable para cada subproceso, por lo que se puede acceder a él al mismo tiempo sin afectarse entre sí.

ThreadLocal no puede reemplazar los mecanismos de sincronización, se enfrentan a diferentes áreas problemáticas.

1: El mecanismo de sincronización es sincronizar el acceso concurrente de múltiples subprocesos al mismo recurso y es una forma efectiva de comunicarse entre múltiples subprocesos.

2.threadLocal son los datos; que aísla múltiples subprocesos. Compartir fundamentalmente no comparte variables entre múltiples subprocesos, por lo que, por supuesto, no es necesario sincronizar múltiples subprocesos.

Importar Java . util . random;

Clase pública ThreadSocpeShareData {

static ThreadLocal lt integer gtt = new ThreadLocal lt integer gt();

Public static void main(String[] args) {

for(int I = 0;ilt3;i){

new Thread(new Runnable() {< / p>

@Override

Public void run(){

int data = new Random();

system out . hilo actual(). getName() "poner" datos);

t.set(data);

MyThreadScopeData.getInstance().

MyThreadScopeData.getInstance().setAge(datos de "edad");

Nueva A().get();

Nueva B().get();

}

}).start();

}

}

Clase estática A{

public void get(){

int datos = t . get();

MyThreadScopeData mis datos = MyThreadScopeData getinstance ();

sistema. println("Un" hilo. hilo actual().

getName() " " datos mis datos . getage() mis datos . getName()/* ms . p>clase estática B{

public void get(){

int data = t . get()

system out. " hilo . hilo actual().getName() " " datos);

}

}

}

Clase MyThreadScopeData{

privado MyThreadScopeData(){}

Hilo estático privado local ltMyThreadScopeData gtmap = new ThreadLocal ltMyThreadScopeData gt()

MyThreadScopeData estático público getInstance(){

Instancia MyThreadScopeData = mapa . get();

if(instancia == null){

instancia = new MyThreadScopeData();

map.set(instancia);

}

Devolver instancia;

}

Nombre de cadena privada;

Edad de cadena privada;

Cadena pública getName() {

Devolver nombre;

}

public void setName(char Nombre de cadena ) {

this.name = nombre

}

Cadena pública getAge() {

Edad de retorno;

p>

}

Almacenamiento público vacío (edad de cadena) {

this.age = edad

}

}

De hecho, la variable que configuramos en ThreadLocal no la almacena ThreadLocal, sino el propio objeto ThreadThread. Cuando el usuario llama al set (Objeto o) del objeto ThreadLocal, el método obtiene el hilo actual a través de Thread.currentThread () y almacena la variable en un Mapa en el hilo. La clave del Mapa es la instancia actual de ThreadLocal.

Mirando el código fuente, estas son las dos funciones principales. Podemos ver la relación de llamada entre ThreadLocal y Thread:

Conjunto público vacío (valor T){

thread t = thread. .currentthread();

ThreadLocalMap mapa = obtener mapa(t);

if (mapa!=null)

map.set(este, valor) ;

Otro

createMap(t, valor);

}

ThreadLocalMap getMap(Thread t) {

Return t.threadLocals

}

conjunto vacío público (valor T){ Thread T = Thread actual Thread(); mapa de ThreadLocalMap = obtener mapa (t); Figura! = null) map.set(this, value); de lo contrario createMap(t, value);} ThreadLocalMap get map(Thread t){ return t Thread locals;}

Puedes buscar dentro de la fuente. código, pero una cosa que se puede confirmar es que la copia del hilo creada en Threadlocal se puede limpiar sin llamar a eliminar, porque la jvm reciclará automáticamente la basura cuando descubra que la comisión del hilo ya no se usa, pero el programa que escribí antes es Limpia con frecuencia después de usar Threadlocal. (Para evitar el uso de memoria, si la cantidad de copias creadas no es demasiado grande, la máquina virtual puede borrarlas automáticamente).

上篇: Qué frameworks son mejores para PythonLos 15 frameworks de código abierto de Python más populares compilados desde GitHub. Estos marcos incluyen E/S de eventos, OLAP, desarrollo web, comunicaciones de red de alto rendimiento, pruebas, rastreadores y más. Django: marco de desarrollo de aplicaciones web Python Django debería ser el marco GAE de Python más famoso e incluso Erlang tiene marcos influenciados por él. Django se está moviendo en una dirección amplia y completa. Es más famoso por su backend de administración totalmente automatizado: solo necesita usar ORM y hacer una definición de objeto simple, y puede generar automáticamente una estructura de base de datos y un backend de administración con todas las funciones. . Diesel: marco de E/S de eventos basado en Greenlet. Diesel proporciona una API sencilla para escribir clientes y servidores de red. Soporta TCP y UDP. Flask: un marco de aplicación web liviano escrito en Python Flask es un marco de aplicación web liviano escrito en Python. Basado en el kit de herramientas WerkzeugWSGI y el motor de plantillas Jinja2. Flask también se denomina "microframework" porque utiliza un núcleo simple y agrega funcionalidad adicional a través de extensiones. Flask no tiene una base de datos predeterminada ni una herramienta de validación de formularios. Cubos: marco ligero de Python OLAPCubes es un marco ligero de Python que contiene herramientas para OLAP, análisis de datos multidimensionales y exploración de datos agregados: marco ligero de Python para crear mapas vectoriales Kartograph es un marco ligero de Python para crear mapas vectoriales Biblioteca Python. Kartograph.py todavía está en versión beta, puedes probarlo en un entorno virtualenv. Pulsar: un marco de concurrencia basado en eventos para Python Pulsar es un marco de concurrencia basado en eventos. Con Pulsar, puede escribir un marco que ejecute una o más actividades en diferentes procesos o subprocesos: Falcon: creación de alto rendimiento para API de nube y aplicaciones web. backends Marco de Python Falcon es un marco de Python de alto rendimiento para crear API en la nube que fomenta el uso del estilo arquitectónico REST para realizar la mayor cantidad de trabajo posible con el menor esfuerzo posible. Dpark: la versión Python de Spark Dpark es un clon de Python de Spark. Es un marco informático distribuido de Python que puede implementar fácilmente procesamiento de datos a gran escala y cálculos iterativos. Dpark es implementado por Douban. La mayor parte del análisis de datos en Douban se completa con Dpark y se vuelve cada vez más complejo. Buildbot: Buildbot: marco de prueba de integración continua basado en Python Buildbot es un marco de código abierto que automatiza el proceso de creación, prueba y lanzamiento de software. Siempre que hay un cambio en el código, el servidor requiere que los clientes en diferentes plataformas creen y prueben el código inmediatamente, y recopila e informa los resultados de la compilación y las pruebas de diferentes plataformas: Zerorpc: un marco RPC distribuido de alto rendimiento basado en ZeroMQ ZeroMQ es un marco RPC distribuido de alto rendimiento basado en la implementación del Protocolo de llamada a procedimiento remoto (RPC) desarrollado por ZeroMQ y MessagePack. Zerorpc y Zerorpc que utilizan ServiceAPI se denominan zeroservices. Zerorpc se puede llamar mediante programación o desde la línea de comando. Bottle: Micro Python Web Framework Bottle es un framework web de micro Python simple y eficiente que sigue WSGI. Se dice que es mini porque tiene un solo archivo y no depende de ningún módulo de terceros, excepto la biblioteca estándar de Python. 下篇: ¿Qué debo hacer si no se puede ajustar el brillo de la pantalla en win8.1?