Alibaba: la primavera de 2021 recluta preguntas de entrevista de Java intermedias y avanzadas, 50 explicaciones detalladas, a la perfección

Alibaba: Autumn recluta preguntas de entrevista de Java intermedias y avanzadas, 50 explicaciones detalladas, a la perfección

 

Recientemente, muchos zapatos para niños me han preguntado acerca de las preguntas de mi entrevista. Hoy, he recopilado algunas preguntas comunes en las entrevistas de los programadores para todos. ¡Espero que sea útil para los zapatos de los niños! [Hay un método completo de recopilación de preguntas de la entrevista al final del artículo]

Pregunta 1 : ¿Para qué sirve el multiproceso?

Una pregunta que puede parecer una tontería para muchas personas: usaré multi-threading, ¿para qué sirve? En mi opinión, esta respuesta es aún más absurda. El llamado "conocer la razón, conocer la razón", "poder usar" pero "conocer la razón", "por qué usar" es "conocer la razón", y sólo cuando el grado de "conocer la razón y conocer la razón Se puede decir que un punto de conocimiento se puede utilizar libremente. Bien, déjame hablar sobre mis puntos de vista sobre este tema:

(1) Aproveche al máximo las ventajas de la CPU multinúcleo

Con el avance de la industria, los portátiles, las computadoras de escritorio e incluso los servidores de aplicaciones comerciales actuales son al menos de doble núcleo, y no son infrecuentes los de 4, 8 o incluso 16 núcleos. Si se trata de un programa de un solo subproceso, entonces en una CPU de doble núcleo se desperdició el 50% y el 75% se desperdició en una CPU de 4 núcleos. El llamado "subproceso múltiple" en una CPU de un solo núcleo es un subproceso múltiple falso. El procesador solo puede procesar una parte de la lógica al mismo tiempo, pero los subprocesos cambian más rápido y parece que varios subprocesos se ejecutan "simultáneamente". El subproceso múltiple en una CPU de varios núcleos es el subproceso múltiple real. Permite que su lógica de varios segmentos funcione al mismo tiempo. El subproceso múltiple puede realmente aprovechar la CPU de varios núcleos y lograr el propósito de hacer uso de la CPU.

(2) Evitar el bloqueo

Desde la perspectiva de la eficiencia del programa, una CPU de un solo núcleo no solo no aprovecha las ventajas del subproceso múltiple, sino que cambiará el contexto del subproceso debido a que el subproceso múltiple se ejecuta en una CPU de un solo núcleo, lo que reducirá el eficiencia global del programa. Pero para las CPU de un solo núcleo, todavía tenemos que aplicar subprocesos múltiples, solo para evitar el bloqueo. Imagine que si una CPU de un solo núcleo utiliza un solo hilo, mientras el hilo esté bloqueado, por ejemplo, leyendo ciertos datos de forma remota, el par no ha regresado y no se ha establecido el período de tiempo de espera, entonces todo su programa lo hará. ser antes de que se devuelvan los datos. Los subprocesos múltiples pueden evitar este problema. Se están ejecutando varios subprocesos al mismo tiempo. Incluso si la ejecución del código de un subproceso está bloqueada para leer datos, no afectará la ejecución de otras tareas.

(3) Fácil de modelar

Ésta es otra ventaja que no es tan obvia. Suponga que hay una gran tarea A, programación de un solo subproceso, entonces hay muchas consideraciones y es problemático construir el modelo de programa completo. Pero si descompone esta gran tarea A en varias tareas pequeñas, tarea B, tarea C y tarea D, crea el modelo del programa por separado y ejecuta estas tareas por separado a través de múltiples subprocesos, será mucho más simple.

Pregunta 2 : Cómo obtener el archivo de volcado de subprocesos en Java

Para problemas como bucles infinitos, interbloqueos, bloqueo, apertura lenta de la página, etc., presionar el volcado de hilo es la mejor manera de resolver el problema. El llamado volcado de subprocesos es la pila de subprocesos. Hay dos pasos para obtener la pila de subprocesos:

(1) Para obtener el pid del hilo, puede usar el comando jps , o en el entorno Linux, puede usar ps -ef | grep java

(2) Para imprimir la pila de subprocesos, puede usar el comando jstack pid, y también puede usar kill -3 pid en el entorno Linux

Además, la clase Thread proporciona un método getStackTrace () que también se puede utilizar para obtener la pila de subprocesos. Este es un método de instancia, por lo que este método está vinculado a una instancia de subproceso específico, y cada vez que obtiene la pila de que un subproceso específico se está ejecutando actualmente,

Pregunta 3 : ¿Cuál es el papel del modelo productor-consumidor?

Esta pregunta es muy teórica, pero muy importante:

(1) Mejorar la eficiencia operativa de todo el sistema equilibrando la capacidad de producción del productor y la capacidad de consumo del consumidor . Esta es la función más importante del modelo productor-consumidor.

(2) Desacoplamiento , que es un efecto incidental del modelo productor-consumidor. El desacoplamiento significa que hay menos conexiones entre productores y consumidores. Cuantas menos conexiones, más pueden desarrollarse independientemente sin recibir restricciones mutuas.

Pregunta 4 : s1 corto = 1; s1 = s1 + 1; ¿qué pasa? S1 corto = 1; s1 + = 1; ¿qué pasa?

Análisis:

Las preguntas de la entrevista son muy anormales, así que esté preparado para el abuso.

s1 = s1 + 1 provocará un error, s1 + 1 es un tipo int y no se puede asignar int a s1. Necesita mostrar la conversión, s1 = (int) (s1 + 1), y s1 + = 1 no saldrá mal. En cuanto a la razón, algunas personas dicen que está relacionado con el mecanismo del compilador. Necesita mirar el principio de compilación. El principio de compilación es el más molesto. ¿Qué tal esto?

Alibaba: Autumn recluta preguntas de entrevista de Java intermedias y avanzadas, 50 explicaciones detalladas, a la perfección

 

Pregunta 5 : Cómo detectar si un hilo contiene un monitor de objeto

También vi una pregunta de entrevista de múltiples subprocesos en Internet para saber que hay una manera de determinar si un subproceso contiene un monitor de objeto: la clase Thread proporciona un método HoldLock (Object obj), si y solo si el monitor del objeto obj es Solo cuando un hilo se mantiene, devolverá verdadero. Tenga en cuenta que este es un método estático, lo que significa que "un hilo" se refiere al hilo actual.

Pregunta 6 : Dame una de las excepciones de tiempo de ejecución que ves con más frecuencia.

Análisis :

Esta pregunta también es muy común, si no puede responderla, el entrevistador pensará que no tiene experiencia en programación.

NullPointerException, excepción de referencia nula. Para ser honesto, las preguntas de la prueba escrita de ChinaSoft tienen esto. Muchas personas incluso malinterpretaron el significado de la pregunta. No reconocieron que la excepción de tiempo de ejecución se refiere a la excepción de tiempo de ejecución.

Pregunta 7 : la diferencia entre sincronizado y ReentrantLock

Synchronized es la misma palabra clave que if, else, for, while, y ReentrantLock es una clase, que es la diferencia esencial entre los dos. Dado que ReentrantLock es una clase, proporciona características cada vez más flexibles que sincronizadas. Puede ser heredado, puede tener métodos y puede tener una variedad de variables de clase. ReentrantLock es más extensible que sincronizado en varios aspectos:

(1) ReentrantLock puede establecer el tiempo de espera para adquirir el bloqueo, a fin de evitar un punto muerto

(2) ReentrantLock puede obtener información sobre varias cerraduras

(3) ReentrantLock puede implementar múltiples notificaciones de manera flexible

Pregunta 8 : El papel de la palabra clave volátil

Un tema muy importante es que todos los programadores de Java que aprenden y aplican subprocesos múltiples deben dominarlo. El requisito previo para comprender el papel de la palabra clave volátil es comprender el modelo de memoria de Java. El modelo de memoria de Java no se trata aquí. Puede consultar el punto 31. La palabra clave volátil tiene dos funciones principales:

(1) El multiproceso se desarrolla principalmente en torno a las dos características de visibilidad y atomicidad. La variable modificada por la palabra clave volátil asegura su visibilidad entre múltiples hilos, es decir, cada vez que se lee una variable volátil, debe ser la más reciente.

(2) La ejecución del código subyacente no es tan simple como el lenguaje de alto nivel que hemos visto — programa Java. Su ejecución es código Java—> bytecode—> ejecuta el código C / C ++ correspondiente según el bytecode—> C / C ++ El código se compila en lenguaje ensamblador -> interactuar con el circuito de hardware.En realidad, para obtener un mejor rendimiento, la JVM puede reordenar las instrucciones y pueden ocurrir algunos problemas inesperados en el subproceso múltiple. El uso de volatile reordenará la semántica prohibida, por supuesto, esto también reduce la eficiencia de ejecución del código hasta cierto punto

Desde un punto de vista práctico, una función importante de los volátiles es combinarlos con CAS para garantizar la atomicidad. Para obtener más detalles, consulte las clases del paquete java.util.concurrent.atomic, como AtomicInteger.

Pregunta 9: ¿Qué son el bloqueo optimista y el bloqueo pesimista?

(1) Bloqueo optimista: al igual que su nombre, es optimista sobre los problemas de seguridad de subprocesos causados ​​por operaciones concurrentes. El bloqueo optimista cree que la competencia no siempre ocurre, por lo que no es necesario mantener el bloqueo. dos Esta acción se utiliza como una operación atómica para intentar modificar las variables en la memoria, si falla, significa que hay un conflicto, por lo que debe haber una lógica de reintento correspondiente.

(2) Bloqueo pesimista: aún como su nombre, es pesimista sobre los problemas de seguridad de subprocesos causados ​​por operaciones concurrentes. El bloqueo pesimista cree que la competencia siempre ocurrirá, por lo que cada vez que se opera un recurso, tendrá una exclusiva El bloqueo es como sincronizado, no importa si son las tres o las siete y veintiuno, puede operar el recurso directamente cuando lo bloquea.

Pregunta diez : programación Java para escribir un programa que provocará un punto muerto

La primera vez que vi este tema pensé que era una muy buena pregunta. Mucha gente sabe lo que es un interbloqueo: el hilo A y el hilo B esperan los bloqueos del otro, lo que hace que el programa se repita indefinidamente. Por supuesto, se limita a esto. No sé cómo escribir un programa de interbloqueo. En este caso, no entiendo qué es un interbloqueo. Si entiendo una teoría, se acabó. Encontré un problema de interbloqueo en práctica Básicamente es invisible.

Para comprender realmente qué es un punto muerto, este problema no es difícil, solo unos pocos pasos:

(1) Los dos subprocesos contienen dos objetos Object: lock1 y lock2. Estos dos bloqueos se utilizan como bloqueos para bloques de código de sincronización;

(2) El bloque de código de sincronización en el método run () del hilo 1 primero adquiere el bloqueo de objeto de lock1, Thread.sleep (xxx), no lleva mucho tiempo, 50 milisegundos es casi lo mismo y luego adquiere el objeto cerradura de la cerradura 2. El propósito principal de esto es evitar que el hilo 1 adquiera los bloqueos de objetos de los objetos lock1 y lock2 a la vez.

(3) Ejecución del hilo 2) (El bloque de código de sincronización en el método primero obtiene el bloqueo de objeto de lock2 y luego obtiene el bloqueo de objeto de lock1. Por supuesto, el bloqueo de objeto de lock1 ha sido retenido por el bloqueo del hilo 1, y el hilo 2 debe estar esperando el hilo. 1 Suelte el bloqueo de objeto de lock1

De esta manera, el subproceso 1 "duerme" después de dormir, el subproceso 2 ha adquirido el bloqueo de objeto de lock2 y el subproceso 1 intenta adquirir el bloqueo de objeto de lock2 en este momento y se bloquea. En este momento, se forma un interbloqueo . El código no está escrito, ocupa mucho espacio Java Multithreading 7: Deadlock Este artículo contiene la implementación del código de los pasos anteriores.

Alibaba: Autumn recluta preguntas de entrevista de Java intermedias y avanzadas, 50 explicaciones detalladas, a la perfección

 

Pregunta 11 : ¿Qué sucede si la cola del grupo de subprocesos está llena cuando envía una tarea?

Si usa LinkedBlockingQueue, que es una cola ilimitada, no importa. Continúe agregando tareas a la cola de bloqueo para su ejecución, porque LinkedBlockingQueue puede considerarse como una cola infinita, que puede almacenar tareas indefinidamente; si usa una cola limitada, por ejemplo, en el caso de ArrayBlockingQueue, la tarea se agregará primero a ArrayBlockingQueue. Cuando ArrayBlockingQueue esté llena, se utilizará la política de rechazo RejectedExecutionHandler para procesar las tareas completas. El valor predeterminado es AbortPolicy.

Pregunta 12 : La diferencia entre hashmap y hashtable.

Análisis:

Este ha encontrado más.

Alibaba: Autumn recluta preguntas de entrevista de Java intermedias y avanzadas, 50 explicaciones detalladas, a la perfección

 

Pregunta 13 : ¿Qué es el giro?

Muchos códigos sincronizados son códigos simples, y el tiempo de ejecución es muy rápido. En este momento, todos los subprocesos en espera están bloqueados. Puede ser una operación que no valga la pena, porque el bloqueo de subprocesos implica el problema de cambiar entre el modo de usuario y el modo de kernel. . Dado que el código sincronizado se ejecuta muy rápido, deje que el hilo que espera el bloqueo no se bloquee, pero haga un bucle ocupado en el límite de sincronizado, que es giro. Si realiza varios bucles ocupados y descubre que no se ha obtenido el bloqueo, vuelva a bloquearlo. Esta puede ser una mejor estrategia.

Pregunta 14: ¿Qué es el modelo de memoria Java?

El modelo de memoria Java define una especificación para el acceso multiproceso a la memoria Java. La descripción completa del modelo de memoria de Java no es algo que se pueda decir claramente en estas pocas oraciones. Permítanme resumir brevemente varias partes del modelo de memoria de Java:

(1) El modelo de memoria Java divide la memoria en memoria principal y memoria de trabajo. El estado de la clase, es decir, las variables compartidas entre clases, se almacena en la memoria principal.Cada vez que un hilo de Java usa estas variables en la memoria principal, leerá las variables en la memoria principal una vez y dejará que estas memorias existan. .Hay una copia en su memoria de trabajo.Cuando ejecuta su propio código de hilo, usa estas variables y opera en la copia en su memoria de trabajo. Después de que se ejecuta el código del hilo, el último valor se actualizará en la memoria principal

(2) Se definen varias operaciones atómicas para manipular variables en la memoria principal y la memoria de trabajo.

(3) Definir las reglas para el uso de variables volátiles

(4) sucede antes, es decir, el principio de la primera aparición, que define algunas reglas de que la operación A debe ocurrir antes de la operación B. Por ejemplo, el código delante del flujo de control en el mismo hilo debe ocurrir antes que el código detrás el flujo de control y un bloqueo de liberación La acción de desbloqueo debe ocurrir antes de la acción de bloqueo de bloqueo para el mismo bloqueo, etc. Siempre que se cumplan estas reglas, no se requieren medidas de sincronización adicionales. Si un fragmento de código no cumple, todo sucede -antes de las reglas, este fragmento de código debe ser inseguro para subprocesos

Pregunta 15 : Después de que un hilo ingresa a un método sincronizado de un objeto, ¿pueden otros hilos ingresar a otros métodos de este objeto?

Análisis:

Alibaba: Autumn recluta preguntas de entrevista de Java intermedias y avanzadas, 50 explicaciones detalladas, a la perfección

 

Alibaba: Autumn recluta preguntas de entrevista de Java intermedias y avanzadas, 50 explicaciones detalladas, a la perfección

 

Pregunta 16 : Hay una declaración de retorno en try {}, luego el código en finalmente {} inmediatamente después de que se ejecutará el intento, ¿cuándo se ejecutará, antes o después del retorno?

Análisis :

Se ejecuta antes del retorno, como lo demuestra el programa:

Alibaba: Autumn recluta preguntas de entrevista de Java intermedias y avanzadas, 50 explicaciones detalladas, a la perfección

 

El resultado es:

retroceder

finalmente

volver 1

Pregunta 17 : seguridad del hilo del modo singleton

Es una pregunta pasada de moda. Lo primero que hay que decir es que la seguridad de subprocesos del modo singleton significa que una instancia de una determinada clase solo se creará una vez en un entorno de subprocesos múltiples. Hay muchas formas de escribir el modo singleton, permítanme resumir:

(1) La escritura del patrón singleton chino hambriento: seguridad del hilo

(2) El método de escritura del modo perezoso singleton: no seguro para subprocesos

(3) La redacción del modo singleton de bloqueo de doble verificación: seguridad de hilo

Pregunta 18 : Claramente hay solo una declaración "recuento de retorno" en el método size () de Hashtable, ¿por qué necesitamos sincronizar?

Esta es mi confusión anterior, no sé si ha pensado en este tema. Si hay varias declaraciones en un método, y todas operan en la misma variable de clase, entonces ningún bloqueo en un entorno multiproceso conducirá inevitablemente a problemas de seguridad de subprocesos. Esto es fácil de entender, pero el método size () claramente solo tiene una declaración, ¿Por qué tenemos que bloquearlo?

Hay dos razones principales para comprender este problema trabajando y estudiando lentamente:

(1) Al mismo tiempo, solo un subproceso puede ejecutar el método sincronizado de una clase fija, pero para el método no sincronizado de la clase, varios subprocesos pueden acceder a él al mismo tiempo. Por lo tanto, hay un problema. Tal vez el hilo A esté ejecutando el método put de Hashtable para agregar datos, el hilo B normalmente puede llamar al método size () para leer el número de elementos actuales en Hashtable, y el valor leído puede no ser el El último subproceso A puede haber terminado de agregar datos, pero el subproceso B ya ha leído el tamaño sin coincidir con el tamaño ++, por lo que el tamaño leído por el subproceso B debe ser inexacto. Después de agregar sincronización al método size (), significa que el subproceso B llama al método size () solo después de que el subproceso A llama al método put, lo que garantiza la seguridad del subproceso.

(2) La CPU ejecuta código, pero no es código Java. Esto es muy importante y debe recordarse. El código Java finalmente se traduce en código ensamblador para su ejecución, y el código ensamblador es el código que realmente puede interactuar con los circuitos de hardware. Incluso si ve que solo hay una línea de código Java, e incluso si ve que solo hay una línea de código de bytes generado después de que se compila el código Java, no significa que para la capa inferior, solo haya una operación de esta oración. Se asume que una oración de "recuento de retorno" se traduce en tres oraciones de ensamblaje y se ejecuta. Es muy posible que después de que se ejecute la primera oración, el hilo se cambie.

Pregunta 19 : ¿Puede swtich actuar sobre byte, long y string?

Análisis:

La expresión en la sentencia switch solo puede ser de tipo entero, es decir, debe ser de tipo int, char o enumerado. No puede ser booleano o de punto flotante, o incluso otros tipos de datos enteros (bytes, cortos y largos).

Pregunta 20 : ¿Cómo utilizan los grupos de subprocesos las empresas con alta concurrencia y poco tiempo de ejecución de tareas? ¿Cómo utilizan los grupos de subprocesos las empresas con baja concurrencia y tiempo de ejecución de tareas prolongado? ¿Cómo utilizan los grupos de subprocesos las empresas con alta simultaneidad y largo tiempo de ejecución empresarial?

Esta es una pregunta que vi en el sitio web de programación concurrente. Puse esta pregunta en la última. Espero que todos puedan verla y pensar en ella, porque esta pregunta es muy buena, muy práctica y muy profesional. Con respecto a este tema, mi opinión personal es:

(1) Para servicios con alta simultaneidad y tiempo de ejecución de tareas corto, la cantidad de subprocesos en el grupo de subprocesos se puede establecer en la cantidad de núcleos de CPU + 1, lo que reduce el cambio de contexto de subprocesos

(2) Las empresas con baja concurrencia y tiempo de ejecución de tareas prolongado deben distinguirse:

  • Si el tiempo del negocio se concentra durante mucho tiempo en operaciones de E / S, es decir, tareas intensivas de E / S, debido a que las operaciones de E / S no ocupan la CPU, no deje que toda la CPU esté inactiva, puede aumentar el número de subprocesos en el grupo de subprocesos para hacer que el procesamiento de la CPU sea más comercial
  • Si el tiempo del negocio es largo y se concentra en operaciones de computación, es decir, tareas de computación intensiva, esto no es posible. Igual que (1), configure el número de subprocesos en el grupo de subprocesos para que sea menor, reduciendo el cambio de contexto de subprocesos

(3) Alta simultaneidad y tiempo de ejecución empresarial prolongado. La clave para resolver este tipo de tarea no es el grupo de subprocesos, sino el diseño general de la arquitectura. Ver si ciertos datos de estas empresas se pueden almacenar en caché es el primer paso, y agregar servidores es el primer paso El segundo paso, en cuanto a la configuración del grupo de subprocesos, consulte (2) para la configuración. Por último, es posible que también sea necesario analizar el problema del largo tiempo de ejecución empresarial para ver si el middleware se puede utilizar para dividir y desacoplar tareas.

Beneficios del lector:

Por razones de espacio, no puedo enumerar todos los problemas. He organizado estos problemas en documentos y los he transferido al disco de red. Los amigos que lo necesiten solo necesitan [ ver la imagen de abajo para agregar un pequeño asistente ] para recibirlos gratis . ! !

Alibaba: Autumn recluta preguntas de entrevista de Java intermedias y avanzadas, 50 explicaciones detalladas, a la perfección

 

Alibaba: Autumn recluta preguntas de entrevista de Java intermedias y avanzadas, 50 explicaciones detalladas, a la perfección

 

Alibaba: Autumn recluta preguntas de entrevista de Java intermedias y avanzadas, 50 explicaciones detalladas, a la perfección

 

Alibaba: Autumn recluta preguntas de entrevista de Java intermedias y avanzadas, 50 explicaciones detalladas, a la perfección

 

Supongo que te gusta

Origin blog.csdn.net/m0_50180963/article/details/114174903
Recomendado
Clasificación