Resumen Ali Gángster de más de 40 preguntas cara hilos, puede responder a ella unos pocos?

Aquí Insertar imagen Descripción

1, multi-hilo de lo que es el uso?

Mucha gente parece ser posible en una pregunta sin sentido: Me gustaría utilizar múltiples hilos, también se preocupa de qué sirve? En mi opinión, la respuesta es más absurdo. El llamado "conocen saben por qué", "utilizará" sólo "saber", "¿Por qué" es el "saber por qué", en la medida en que "conoce sabe por qué" se puede decir que la un conocimiento con facilidad. OK, aquí para hablar de mis puntos de vista sobre este tema:

(1) toma ventaja de CPU multi-núcleo

Con el progreso de la industria, ahora los ordenadores portátiles, ordenadores de sobremesa e incluso servidores de aplicaciones comerciales están también al menos un doble núcleo, 4-core, 8-núcleo o 16-núcleo también es raro, si es programa single-roscado, entonces la CPU de doble núcleo en desperdiciado 50% en una CPU 4-core se desperdicia por 75%. En una sola CPU núcleo llamado "multiproceso" Eso es falso multiproceso, procesador sólo se ocupará de los mismo período de tiempo de la lógica, pero más rápido que la conmutación entre los hilos, que parecía múltiples hilos "simultáneamente" ejecutar Bale. Multi-threading en la CPU multi-núcleo es un verdadero multi-hilo, que le permite trabajar en el multisegmento misma lógica, multi-hilo, realmente pueden jugar las ventajas de la CPU multi-núcleo para lograr el objetivo de la plena utilización de la CPU.

(2) prevenir la obstrucción

Desde el punto de vista de la eficiencia operativa de procedimiento, la CPU de un solo núcleo no sólo reproducirá las ventajas de multi-hilo, ejecución de subprocesos múltiples, ya que conducirá a enhebrar cambios de contexto, y reducir la eficiencia global del programa en un solo núcleo de la CPU. Pero todavía tenemos que aplicaciones multi-hilo de la CPU de un solo núcleo, es para evitar la obstrucción. Pensemos, si es antes de la CPU de un solo núcleo utilizando un solo hilo, por lo que el tiempo que este hilo se bloquea, dicen unos datos de forma remota lo leen, el par aún no ha sido devuelto y ningún conjunto de tiempo de espera, entonces el programa completo en la parte trasera de datos de retorno dejado de funcionar. Multithreading puede evitar este problema, un número de hilos de ejecutar simultáneamente, incluso si un hilo de ejecución de código para leer datos bloqueados, que no afectará a la ejecución de otras tareas.

(3) la facilidad de modelado

Esta es otra ventaja de la no tan obvio. Suponga que tiene una gran tarea A, la programación de un único subproceso, a continuación, debe tener en cuenta una gran cantidad, a construir todo el modelo de programa es demasiado problema. Pero si esta gran tarea Un descompone en varias pequeñas tareas, la tarea B, C tarea, la tarea D, se establecieron modelo de programa y ejecutar estas tareas a través de múltiples hilos, respectivamente, entonces mucho más simple.

2, crear una forma de rosca

Un problema más común, generalmente tres tipos:

(1) la herencia de clases de rosca
(2) aplicar Ejecutable
(3) implementar la interfaz Callable

En cuanto a lo que es mejor, no hace falta decir que el segundo es sin duda bueno, porque la forma de implementación de la interfaz es más flexible que forma la herencia de clases, sino también para reducir el grado de acoplamiento entre los programas orientados a la interfaz de programación es el núcleo patrones de diseño de seis principios.

Distinción 3, método método start () y el run ()

Sólo llamar al método start (), exhibirán características de un multi-hilo, diferentes hilos run () código de método dentro ejecutado alternativamente. Si usted acaba de llamar al método run (), el código se ejecuta de forma sincrónica, debe esperar a que la carrera de un hilo método () después de que el código dentro de todo está terminado, otro hilo puede ejecutar run () Código del método en el interior.

4, la diferencia entre la interfaz Callable Ejecutable y la interfaz

Un problema poco más profundo, también ver una amplitud de conocimientos de los programadores de Java para aprender.

interfaz ejecutable en el valor devuelto por el método run () es nula, sólo lo hacen únicamente para llevar a cabo el código del método run () solamente; se puede llamar llamada devuelve el método de interfaz (un valor), es un genérico y futuro, FutureTask ajuste puede ser usada para obtener los resultados de la ejecución asíncrona.

De hecho, esta es una característica útil, porque el único subproceso multi-hilo más difícil en comparación con una razón más importante es porque el complejo multi-hilo llena de sexo desconocido, si un cierto hilos? Algunos hilos se ejecutan durante cuánto tiempo? Si ciertos temas cuando se ha completado la ejecución de una misión que esperamos que los datos? No sé, lo que podemos hacer es esperar a que esta tarea multi-roscado se terminó. Cancelación de una tarea de ese hilo, es muy útil en caso de que se puede llamar + Futuro / FutureTask pero se puede obtener los resultados de ejecutar múltiples hilos, no se puede esperar demasiado tiempo para obtener los datos necesarios.

5, la diferencia CyclicBarrier y CountDownLatch

Dos miradas un poco como una clase, están en java.util.concurrent, se pueden utilizar para representar el código para ejecutarse en un cierto punto, que la diferencia entre los dos:

(1) una rosca para funcionar CyclicBarrier después de cierto punto, el hilo será detener la ejecución hasta que todos los hilos han llegado a este punto, todos los hilos antes de volver a ejecutar; CountDownLatch no es, un hilo para funcionar en algún momento después de eso, sólo sigue funcionando a un valor de -1, el hilo

(2) CyclicBarrier sólo puede evocar una tarea, CountDownLatch puede evocar una serie de tareas

(3) CyclicBarrier reutilizable, CountDownLatch no puede volver a utilizar, el valor de recuento 0 no se utiliza de nuevo en CountDownLatch

6, el papel de la palabra clave volátiles

Una cuestión muy importante es que cada estudio, los programadores de aplicaciones multi-hilo de Java debe aprovechar. Comprender el papel de la palabra clave volátil es entender la premisa del modelo de memoria de Java, no se habla aquí el modelo de memoria de Java, se puede ver los primeros 31 puntos, el papel de la palabra clave volátiles dos razones principales:

(1) multi-hilo principalmente giran alrededor de visibilidad y atomicidad dos propiedades, el uso de la palabra clave volátil variables modificadas para asegurar su visibilidad entre los múltiples hilos, es decir, cada lectura variable de volátiles, que debe ser la última los datos

(2) el código subyacente que realiza el lenguaje de alto nivel como los programas de Java que vemos ---- tan simple, su ejecución es el código de Java -> código de bytes -> ejecuta el código correspondiente al C / C ++ basado en el código de bytes -> C / código C ++ se compila en lenguaje ensamblador - algunos problemas inesperados> e interacción de hardware, en la realidad, con el fin de obtener un mejor rendimiento JVM podría cambiar el orden de instrucciones, puede ocurrir en múltiples hilos. Se prohibirá el uso de la semántica volátiles de reordenamiento, que por supuesto debe también reduce el grado de eficiencia de código

Desde un punto de vista práctico, un papel importante es volátil y CAS combina para garantizar la atomicidad, detalles se pueden encontrar bajo la categoría de paquete java.util.concurrent.atomic, tales AtomicInteger.

7. Lo que es seguro para subprocesos

Es una cuestión teórica, la respuesta tiene mucha variedad, que dan una visión personal a la mejor explicación: si su código en múltiples hilos en ejecución y ejecución nunca será capaz de obtener el mismo resultado en un solo hilo a continuación, el código es seguro para subprocesos.

Esta pregunta es importante mencionar que el lugar es también un hilo de seguridad de varios niveles:

(1) inmutable

Como cadena, entero, Long estos son el último tipo de clase, un hilo no puede cambiar cualquiera de sus valores, para ser cambiado a menos que una nueva creación, por lo que estos objetos inmutables sin ningún tipo de medios de sincronización pueden ser utilizados directamente en un entorno multiproceso uso

hilo de seguridad (2) Absolute

Independientemente del entorno de tiempo de ejecución, la persona que llama no necesita medidas adicionales de sincronización. Para ello generalmente lleva mucho gasto extra, Java señaló en su propia clase thread-safe, la gran mayoría, de hecho, no están seguro para subprocesos, pero absolutamente seguro para subprocesos clase, Java también ha, digamos CopyOnWriteArrayList, CopyOnWriteArraySet

(3) el hilo de seguridad relativa

El hilo de seguridad relativa que se dice en nuestro sentido habitual del hilo de seguridad, tales como vector, añadir, eliminar tienen métodos no serán interrumpidos operaciones atómicas, pero sólo hasta cierto punto, si hay un hilo transversal de un vector , hay hilos al mismo tiempo añadir este vector, aparecerá ConcurrentModificationException 99% de los casos, que es a prueba de rápido mecanismo.

(4) no thread-safe

Esto apenas nada que decir, ArrayList, LinkedList, HashMap son de clase no seguro para subprocesos

8, Java como llegar al archivo de volcado de hilo

bucle infinito, callejones sin salida, el bloqueo, la página se abre temas lentos y otros, jugando un vertedero de hilo es la mejor manera de resolver el problema. Eso se llama una pila de rosca volcado hilo, para obtener la pila hilo tiene dos pasos:

(1) para obtener el hilo PID, puede utilizar el comando JPS en el entorno Linux también puede utilizar el ps-ef | grep java

(2) la pila de hebras de impresión, puede utilizar el comando jstack pid en el entorno Linux también se puede utilizar kill -3 pid

Además mención que, clase Thread proporciona un método getStackTrace () también se puede utilizar para obtener una pila hilo. Este es un método de instancia, por lo que este método es específico y vinculante ejemplo hilo, cada adquisición es obtener una específica Actualmente corriendo pila hilo,

9. ¿Qué pasa si un hilo de excepción se produce cuando se ejecuta

Si la excepción no se detecta, a continuación, se detiene ejecuta el hilo. Otro punto importante es la siguiente: Si este hilo tiene un monitor de un objeto, entonces el monitor del objeto se libera inmediatamente

10, la forma de compartir datos entre dos hilos

Al compartir objetos entre las discusiones sobre el mismo, y luego esperar / notificar a / notifyAll, esperan / señal / signalAll ser Arouse y espera, por ejemplo BlockingQueue bloqueo de datos de la cola es compartido entre hilos y diseño

11, el sueño y el método método wait ¿Cuál es la diferencia

Se le pide a menudo a esta pregunta, el método de sueño y el método de espera puede ser utilizado para dar un poco de tiempo de CPU, excepto que si el hilo que sostiene un monitor objeto, método del sueño no se rinde el monitor de este objeto, el método espera renunciará a este monitor de objeto

12. ¿Cuál es el papel de modelo productor-consumidor

Este problema es muy teórico, pero muy importante:

(1) a través de la capacidad de producción y el equilibrio de los productores de energía de gasto de los consumidores para mejorar la eficiencia operativa de todo el sistema, que es el más importante productor de papel modelo de consumo

(2) la disociación, que es un modelo productor-consumidor efecto secundario de los medios de desacoplamiento menos contacto entre productores y consumidores, el menor contacto puede desarrollar solo, sin la necesidad de recibir el uno al otro de las limitaciones

13, ThreadLocal lo utilice

En pocas palabras ThreadLocal es una especie de espacio para la aproximación del tiempo, en el que cada hilo mantiene ThreadLocal.ThreadLocalMap una ley a la dirección de aplicación abierta, el aislamiento de datos, los datos no se comparten, como es natural, no hay duda del hilo de seguridad

14, ¿por qué el método wait () y notify () / notify () para ser invocado contra los bloques de sincronismo

Este método de JDK es obligatoria, wait (), y notificar método () / notify () debe obtener primero el objeto antes de llamar a la cerradura

15, se descarta método wait (), y notificar () / notifyAll () de cualquier objeto diferencia cuando el monitor

esperar () método, y notificar método cuando el objeto se descarta distinción del monitor se caracteriza () / notifyAll (): espera monitor de objeto () método de liberación inmediata, notificar () / notifyAll () se completa método de la rosca va a esperar el código restante abandonará el monitor objeto.

16. ¿Por qué usar un grupo de subprocesos

Evitar frecuentes crear y destruir hilos, para reutilizar el objeto hilo. Además, utilizando un grupo de subprocesos también puede ser controlado de manera flexible de acuerdo con el número de proyectos concurrentes.

17, la forma de detectar si un hilo que sostiene un monitor objeto

Yo estaba en la fila para ver más de una preguntas cara hilo antes sabemos que hay maneras de determinar si un hilo que sostiene un monitor objeto: clase Thread proporciona un método holdsLock (Object obj), si y sólo si el monitor es un objeto obj devuelve los hilos del tiempo será verdad, que este es un método estático, lo que significa que "ciertos hilos" se refiere a la rosca actual.

18, la diferencia entre sincronizada y ReentrantLock

Está sincronizado y si, de lo contrario, ya que, mientras que la misma palabra clave, ReentrantLock es de clase, que es la diferencia esencial entre los dos. Desde ReentrantLock es una clase, entonces se proporciona más flexibilidad que las características sincronizados pueden ser heredados, hay maneras en que puede, se puede tomar una variedad de variables de clase, escalabilidad ReentrantLock sincronizado que se refleja en los puntos:

(1) ReentrantLock puede establecer el tiempo de espera para adquirir el bloqueo, evitando así el punto muerto
(2) ReentrantLock puede adquirir diversas cerradura información
(3) flexibilidad ReentrantLock para lograr múltiples notificaciones

Además, tanto el mecanismo de bloqueo no es en realidad el mismo. ReentrantLock llamadas de bajo nivel que los métodos no seguros parque de bloqueo, el funcionamiento sincronizado debe ser la marca cabecera del asunto, que no puedo determinar.

19, ¿cuál es el grado de concurrencia ConcurrentHashMap

ConcurrentHashMap concurrencia es el tamaño del segmento, el valor predeterminado es 16, lo que significa que no puede ser de hasta 16 hilos que operan simultáneamente ConcurrentHashMap, que es la mayor ventaja de la Hashtable ConcurrentHashMap, en cualquier caso, hay dos hilos simultáneamente Hashtable puede obtener el Hashtable datos?

20, lo que es ReadWriteLock

Primera mirada clara, por no decir ReentrantLock malo, sólo ReentrantLock veces tienen limitaciones. Si utiliza ReentrantLock, puede ser él mismo con el fin de evitar que los datos de escritura hilo A, los datos inconsistencias hilo B en los datos leídos causado, pero de esta manera, si el hilo C en la lectura de datos, el hilo D también datos leídos, los datos leídos no va a cambiar los datos, no es necesario bloquear, pero todavía encerrado, lo que reduce el rendimiento del programa.

Debido a esto, antes del nacimiento de la ReadWriteLock bloqueo de lectura-escritura. ReadWriteLock las interfaces es un bloqueo de lectura-escritura, es una implementación específica ReentrantReadWriteLock con interfaz ReadWriteLock, se da cuenta de la separación de leer y escribir, un bloqueo de lectura es compartida, exclusiva bloqueo de escritura no es mutuamente exclusivo de escritura y lectura, leer y escribir, se excluyen mutuamente entre la escritura y lectura, de escritura y de escritura, lectura y escritura mejora el rendimiento.

21, lo que es FutureTask

Este hecho se ha mencionado anteriormente, FutureTask indica que la tarea de una operación asíncrona. FutureTask que puede pasar a una clase de implementación rescatable puede hacer que esperar a que el acceso a los resultados de las operaciones asíncronas de tareas, se ha completado, se determina si se cancelan las tareas de operación. Por supuesto, ya FutureTask también Ejecutable clase de implementación de interfaz, por lo FutureTask también puede ser colocado en el grupo de subprocesos.

22, cómo averiguar qué entorno Linux usando CPU hilo más largo

Se trata de un parcial de problemas prácticos que me siento bastante sentido. Que puede hacer:

Pid (1) proyecto de adquisición, JPS o ps -ef | grep java, han hablado de esto antes
(2) superior -H -p pid, el orden no se puede cambiar

De modo que usted puede imprimir el proyecto actual, el porcentaje de ocupación de cada hilo del tiempo de CPU. Tenga en cuenta que este juego es la LWP, que es el sistema operativo de subprocesos nativos hilo, entonces yo Notebook Colina no desplegó proyecto Java en el entorno Linux, así que no hay manera de capturar la demo, los usuarios y amigos si la empresa está utilizando proyecto de implementación entorno Linux, se puede tratar aproximadamente.

Uso "top -H -p pid" + "JPS PID" se puede encontrar fácilmente un bar con una pila de hebras de hilo intensivo de la CPU, el posicionamiento de este modo ocupan altas razones de CPU, generalmente debido a un funcionamiento incorrecto de los resultados de código en un bucle infinito.

Por último mencionar que, "de arriba -H -p pid" romper el LWP es decimal, "JPS PID" romper con el número del hilo local es hexadecimal, convertirlo, puede navegar a la rosca de la CPU de alto el hilo de corriente apilar hasta.

23, programador de Java para escribir un programa conduciría a un punto muerto

La primera vez que vi este tema, siento que esta es una muy buena pregunta. Mucha gente sabe cómo son los niños de punto muerto: Un hilo y el hilo B de espera para los bloqueos que tienen el uno al otro es infinito bucle infinito hace que el programa continúe. Por supuesto, sólo hasta ahora, y preguntan cómo escribir un punto muerto en el programa no conocen esta situación no saben lo que significa ser un callejón sin salida, comprenden una teoría sobre la cosa terminada, y problemas de índole práctica en un punto muerto básicamente no se puede ver a cabo.

Realmente entender lo que es punto muerto, el problema no es difícil, a pocos pasos:

(1) dos hilos que se llevaron a cabo por objeto dos objetos: lock1 y Lock2. Tanto el bloqueo de código de sincronización como un bloque de cerradura;

método (2) la ejecución de hilo 1 () para obtener los bloques de objeto del código de sincronización de la lock1 cerradura, Thread.sleep (xxx), no requiere mucho tiempo, casi 50 milisegundos, y luego adquirir el Lock2 bloqueo objeto. Esto está pensado principalmente para evitar que el hilo 1 a empezar pronto y ganar un lock1 Lock2 dos objetos de bloqueo de objeto

(3) un RUN hilo 2) (método de adquisición de objetos bloque sincronizado a Lock2 cerradura, y luego adquirir la lock1 bloqueo objeto, por supuesto, entonces ha sido objeto de bloqueo bloqueos lock1 cabo hilo 1, el hilo 2 hilo que esperar ciertamente 1 liberación de la lock1 bloqueo objeto

De esta manera, el hilo 1 del sueño "sueño" terminó, hilo 2 ha adquirido el bloqueo Lock2 objeto de la rosca 1 intenta adquirir el bloqueo de objetos Lock2 este tiempo, están bloqueadas, esta vez en la formación de un callejón sin salida. No escribo el código un poco demasiado del espacio, Java multi-hilo 7: DeadLock este artículo no es el código para lograr los pasos anteriores.

24, cómo despertar un hilo bloqueado

Si el hilo está bloqueado porque la espera de llamadas (), dormir () o método join () causado, puede interrumpir las discusiones, y para activarlo lanzando InterruptedException; si el proceso de IO se encuentra con una obstrucción, no hacer nada, porque el sistema operativo IO aplicación, el código Java y no hay manera directa el acceso al sistema operativo.

25, objetos inmutables iba a ayudar multihilo

Hay un problema mencionado en lo anterior, el objeto inmutable para asegurar la visibilidad de los objetos de memoria, para leer objeto inmutable no requiere medios de sincronización adicionales para mejorar la eficiencia de la ejecución de código.

26, ¿cuál es el contexto del interruptor de múltiples hebras

cambio de contexto Multi-hilo se refiere al control del interruptor de CPU de un hilo ya se está ejecutando a otro lugar y espera para el proceso de obtención de la ejecución de los hilos de la CPU.

27, cuando se presente la tarea, la cola de grupo de subprocesos está llena, entonces, ¿qué va a pasar

Aquí se distingue entre:

Si está utilizando LinkedBlockingQueue cola sin límites, que es la cola sin límites, entonces no importa, seguir añadiendo tareas a la cola de bloqueo a la espera de ser ejecutado, porque LinkedBlockingQueue casi se considera que es una cola infinita, la tarea de almacenamiento ilimitada
si está utilizando una cola limitada como ArrayBlockingQueue la tarea inicial se añadirá a la ArrayBlockingQueue, ArrayBlockingQueue completa, se incrementará el número de hilos en función del valor de maximumPoolSize, si aumenta el número de hilos o mango, sin embargo, continuará ArrayBlockingQueue completo, entonces el proceso va a estar lleno de tareas de política de denegación RejectedExecutionHandler, el valor predeterminado es AbortPolicy

se utiliza 28. ¿Qué algoritmo de programación Java hilo

Preventiva. Después de un hilo quede sin CPU, se calculará el sistema operativo basado en una prioridad total de subproceso de prioridad, la situación de hambre hilo y otros datos y asignar el próximo segmento de tiempo para ejecutar un hilo.

29. ¿Cuál es el papel Thread.sleep (0) es

Este problema y ese problema está relacionado con lo anterior, incluso juntos. Desde Java algoritmo de programación de subprocesos preventiva, por lo que puede ser un caso de roscas a menudo entrar en el control de la CPU, con el fin de permitir que algunos hilos de baja prioridad pueden llegar al control de la CPU, puede utilizar Thread.sleep ( 0) activadas operado manualmente una vez que la asignación de sistema operativo de segmentos de tiempo, que es el equilibrio de control operativo de la CPU.

30, lo que es un spin

Muchos código sincronizado dentro de un código muy simple, el tiempo de ejecución muy rápido, a continuación, esperar a que el bloqueo de rosca podría ser una menos digno de operación, debido a que el hilo de bloqueo de cuestiones relacionadas con el modo de usuario y cambio de modo de núcleo. Dado que la ejecución de código dentro de la sincronizada muy rápido, espera de let por el hilo de bloqueo no está bloqueado, pero no ocupado que circula en la frontera sincronizada, esto es centrifugado. Si usted no encuentra que muchas veces reciben bloqueo ciclo ocupado, y luego bloqueadas, esto puede ser una mejor estrategia.

31. ¿Cuál es el modelo de memoria de Java

modelo de memoria de Java define una memoria de acceso especificación Java multi-hilo. Para completar el modelo de memoria de Java no está aquí para hablar unas pocas palabras para decir claramente, que resume brevemente algunas partes del modelo de memoria de Java:

(1) Java memoria del modelo de memoria en la memoria principal y la memoria de trabajo. la pertenencia de clase, que es compartida entre las variables de clase se almacenan en la memoria principal, cada vez que las hebras Java utilizan estas variables en la memoria principal, leerá una de las principales variables en la memoria, y dejar en la memoria su memoria de trabajo tiene una copia, ejecutar su propio código de hilo, utilice estas variables, propiamente trabajan operación de memoria en la que uno. Una vez finalizada código roscado, que se actualizará a la última valor a la memoria principal

(2) define varios operación atómica, para el funcionamiento de la memoria principal y las variables de memoria de trabajo

(3) define el uso de la regla de variables volátiles

(4) ocurre antes, el principio es decir, primero se produjeron, reglas define los B sobre A unida por delante se produce en funcionamiento, tal como en el mismo hilo como el frente del flujo de control del código primero debe ocurrir en el control posterior del flujo del código, un dispositivo de desbloqueo acción de desbloqueo debe ocurrir por primera vez en la parte posterior para cerrar con un candado acción de bloqueo, etc., siempre que cumplan las normas, que no necesita medidas adicionales de sincronización, si una pieza de código no cumple con todas las normas de pasa-antes, entonces este código que debe ser un no-thread-safe

32. ¿Qué es el CAS

CAS, llama la comparación de comparación y de intercambio, es decir - sustituido. Supongamos que hay tres operandos: valor de la memoria V, el valor esperado de la antigua A, los valores de B a ser modificados, si y sólo si el valor esperado de la A y V son el mismo valor de la memoria, el valor de la memoria será revisado para B y vuelve verdadera, ¿qué otra cosa nada y vuelve falsa. Por supuesto, con la variable CAS debe ser volátil, con el fin de asegurar que cada variable es la memoria principal para obtener la última de ese valor, de lo contrario las viejas expectativas un hilo en un post, siempre es un valor de A no va a cambiar, siempre y cuando CAS falla una operación en particular, nunca tendrá éxito.

33. ¿Cuál es el bloqueo optimista y pesimista

(1) bloqueo optimista: Como su nombre indica, por cuestiones de seguridad hilo entre las operaciones concurrentes generados estado optimista, el bloqueo optimista que la competencia no siempre sucede, por lo que no es necesario para mantener el bloqueo comparará - para reemplazar a dos acciones como una operación atómica intentos para modificar las variables en la memoria, si falla dicho conflicto, entonces debe haber una lógica de reintento correspondiente.

(2) Bloqueo pesimista: o, como su nombre indica, por cuestiones de seguridad hilo entre operaciones simultáneas generadas un estado pesimista, el bloqueo pesimista que la competencia siempre va a suceder, por lo que cada vez que una operación de recursos, llevará a cabo una exclusiva cerradura, como sincroniza, de cualquier manera, que operan directamente sobre el bloqueo en el recurso.

34, lo que es lo AQS

En pocas palabras acerca de AQS, AQS nombre completo AbstractQueuedSychronizer, debe traducirse sincronizador de cola abstracto.

Si la base es CAS java.util.concurrent, a continuación, AQS es el núcleo del contrato y toda la Java, ReentrantLock, CountDownLatch, Semáforo, etc., lo utilizan. AQS realmente conectado en forma de cola de dos vías de todas entrada, digamos ReentrantLock, todos los subprocesos en espera se colocan en una de dos vías de entrada e incluso en la cola delante de un hilo utiliza ReentrantLock Bueno, el caso de la primera cola de dos vías la entrada para iniciar una carrera.

AQS define todas las operaciones en la cola de dos vías, pero sólo trylock abierto y método tryRelease usar para los desarrolladores, los desarrolladores pueden reescribir método trylock y tryRelease en función de su aplicación, con el fin de realizar su función concurrente.

Hilo de seguridad 35, el singleton

un problema común, la primera cosa a decir es medios compatibles con el proceso patrón Singleton: una instancia de una clase sólo se creará una vez en un entorno multiproceso. Hay muchos casos de un solo modo de escribir, resumo:

Escribir (1) hambrientos de realización de modo único: Hilo de seguridad
modo texto (2) de rodillo sencillo modo de realización: no seguro para subprocesos
(3) doble comprobación de bloqueo redacción singleton: Hilo de seguridad

36, Semáforo qué papel

Semáforo es un semáforo, su papel es limitar el número de cierto bloque de código concurrente. Semáforo tiene un constructor, puede pasar un entero de tipo int n, representa un fragmento de código a lo sumo n hilos pueden tener acceso, si se excede n, entonces por favor espere hasta que un hilo completa este bloque de código, el siguiente hilo reentrada. Puede verse que si el entrante Semáforo tipo constructor número entero int n = 1, el equivalente en una sincronizada.

37, tamaño de Hashtable () método, obviamente, sólo una declaración "recuento de retorno", ¿por qué la sincronización?

Este es un confundido delante de mí, no sé si usted no ha pensado en ello. Si más de una declaración de método y están en operación con una variable de clase, entonces desbloqueado en el entorno multiproceso, que conducirá inevitablemente a enhebrar cuestiones de seguridad, se entiende bien, pero el método size () es claramente sólo una instrucción ¿Por qué la cerradura?

Sobre este tema, poco a poco el trabajo, el estudio, hay que entender, por dos razones principales:

(1) al mismo tiempo, solamente un método de sincronización fija de una ejecución del hilo clase, pero para el método asíncrono de la clase, puede acceder a múltiples hilos simultáneamente. Así, de esta manera no habrá problemas, puede añadir método put hilo de ejecución de datos de una tabla hash, el subproceso B puede llamar al método de tamaño normal () para leer el número del elemento actual de la tabla hash, para leer ese valor puede no estar actualizada , un hilo puede ser añadido en los datos, pero no hay un tamaño ++, hilo B ha leído tamaño, a continuación, el hilo B es para la lectura de un cierto tamaño para ser inexactos. Y al método size () después de la adición de sincrónica, lo que significa que el hilo B llama al método size () sólo se puede llamar después de una llamada para poner el método de hilo A se ha completado, garantizando así la seguridad hilo

(2) la CPU ejecutar el código, el código de Java no se ejecuta, es muy crítica, tenemos que recordar. código Java con el tiempo se traduce en código de máquina es el código real que puede ejecutar código máquina y la interacción de hardware. Incluso si sólo se ve una sola línea de código Java, se ve que incluso después de que el código de bytes generada código Java se compila, sólo una línea, esto no significa que el operativo subyacente para una sola declaración de condena. Una hipótesis "recuento de retorno" ha sido traducido a tres ensamblador se ejecuta declaración, una recopilación de declaraciones y su código de máquina correspondiente a hacerlo, y no pudo completar la aplicación de la primera frase, el hilo activada.

38, el constructor de la clase de hilo, se llama un bloque estático que hilo

Se trata de una serie de preguntas muy difíciles y complicadas. Recuerde: constructor de la clase Thread, bloque estático es donde el nuevo hilo de rosca es la clase llamada, y ejecutar el código dentro del método está siendo llamado por el mismo hilo.

Si la declaración anterior hace sentir confundido, entonces, por ejemplo, supongamos que el nuevo Thread2 la Thread1, la función principal de la nueva Thread2, a continuación:

Constructor (1) bloque estático Thread2 es los principales llamadas hilo, Thread2 el método run () se invoca propia Thread2

El método de construcción (2) bloques estáticos Thread1 se llaman Thread2, Thread1 el método run () se invoca su Thread1

39, y el método de sincronización de bloques de sincronización, que es la mejor opción

Sincronizar los bloques, lo que significa que el código fuera del bloque de sincronización es asíncrona, que mejoran aún más la eficiencia del proceso general de código síncrono. Por favor, sepan que un principio: cuando la sincronización posible.

A través de este artículo, puse un poco más, aunque el alcance de la mejor sincronización, pero en el método de optimización máquina virtual Java todavía existe engrosamiento llamado bloqueo, este método es que aumenta el alcance de sincronización. Esto es útil, por ejemplo StringBuffer, es una clase de hilo de seguridad, el append más común naturales () método es un método síncrono, se escribe el código se repite cadenas de agregación, lo que significa que ser repetido de bloqueo -> desbloquear esta desventaja rendimiento, ya que significa que la máquina virtual de Java para cambiar repetidamente entre modo de núcleo y modo de usuario en este hilo, por lo que las llamadas de método Java código de máquina virtual que añadirá en repetidas ocasiones son una cerradura rugosidad operación, una operación prolongada para anexar múltiples método append craneocaudal, se convierte en un gran bloque de sincronización, lo que reduce el bloqueo -> tiempos de desbloqueo, mejorar eficazmente el rendimiento de la ejecución de código.

40, de alta concurrencia, el tiempo de ejecución de la tarea es la abreviatura de negocios cómo utilizar grupo de subprocesos? Cómo concurrencia no es alto, largo tiempo de negocios usando agrupación de hebras de ejecución de la tarea? Alta concurrencia, cómo mucho tiempo de ejecución de negocios que utilizan los servicios de un grupo de subprocesos?

Este es un problema que veo en la programación concurrente en línea, puse esta cuestión en el pasado, espero que todos puedan ver y pensar, porque este es un muy bueno, muy práctico, muy profesional. Sobre este tema, una visión personal es:

(1) alta concurrente, tarea empresarial ejecución corto período de tiempo, el número de hilos en el grupo de subprocesos se puede establecer en el núcleo de la CPU número 1, reduciendo el cambio de contexto hilo

(2) concurrente no es muy alta, mucho tiempo de ejecución de tareas de servicio distinguido para ver:

a) Si el negocio es mucho tiempo se centró en la operación de IO, que es IO-intensiva tarea, ya que la operación no ocupa IO CPU, así que no deje que toda la CPU se retiró y se sientan, se puede aumentar el número de hilos en la piscina, dejar que la CPU manejar más negocios

b) Si el tráfico está concentrado en una operación de mucho tiempo se calcula, que es computacionalmente tareas intensivas, que ninguna solución, y (1), ya que, el número de hilos en la piscina está dispuesto a ser menos, reducir el cambio de contexto hilo

Llave (3) alta concurrencia, la ejecución del negocio de largo plazo, para hacer frente a este tipo de tarea no se enrosque piscina, pero en el diseño general de arquitectura, para ver si pueden hacer negocios dentro de algunas de la caché de datos es el primer paso, el primer aumento en el servidor dos pasos, como grupo de subprocesos conjunto está provisto de referencia (2). Por último, también pueden necesitar mucho tiempo, los problemas de ejecución de negocios, para analizarlo, ver si se puede utilizar el middleware para tareas divididas y desacoplamiento.

atención de bienvenida

Responder atención catálogo pdf sorpresa, recursos de vídeo masivas, acceso www.erlie.cc
Aquí Insertar imagen Descripción

el blog de referencia

[1] https://www.cnblogs.com/xrq730/p/5060921.html

Publicados 385 artículos originales · ganado elogios 1471 · Vistas de 900.000 +

Supongo que te gusta

Origin blog.csdn.net/zzti_erlie/article/details/104200934
Recomendado
Clasificación