Lo crea o no, estas preguntas de la entrevista de Java pueden disuadir al 70% de los programadores de irse. (Con respuestas para explicar)

En el artículo anterior, escribí algunas preguntas de entrevista muy buenas y algunas ideas de aprendizaje para la certificación de entrevistador de Alibaba, pero debido a que el artículo es demasiado largo, está dividido en dos partes para completar, por lo que este artículo escribirá el Java final. Las respuestas están codificadas junto con la entrevista. A continuación se presenta un resumen de la respuesta, parcialmente ampliado.

Al mismo tiempo, he recopilado una gran cantidad de materiales de entrevistas en Java y los he enviado a los estudiantes que desean entrevistar recientemente. Aquellos que lo
necesiten pueden hacer clic: ¡ haga clic aquí, haga clic en esto! ! , Código: csdn.

Inserte la descripción de la imagen aquí

1. Se puede acceder a los métodos privados modificados mediante la reflexión, entonces, ¿cuál es el significado de

Esta pregunta es una pregunta de pensamiento. Te encontrarás en privado todos los días. ¿Alguna vez has pensado en esta pregunta?

Hablando sobre el grado de comprensión del diseño de Java, capte principalmente dos puntos:

1. El modificador privado de Java no está diseñado para una seguridad absoluta, pero es más una restricción para el uso regular de Java por parte de los usuarios;

2. Al llamar rutinariamente a un objeto desde el exterior, puede ver una estructura de clases clara.

2. Orden de inicialización de la clase Java

Permítanme hablar primero de la conclusión: bloque de código estático de clase base, campo de miembro estático de clase base (prioridad paralela, ejecutado en el orden de aparición en el código y solo ejecutado en la primera carga) -> bloque de código estático de clase derivada, clase derivada estática Campo miembro (prioridad paralela, ejecutado en el orden de aparición en el código, y ejecutado solo cuando se carga por primera vez) -> bloque de código ordinario de la clase base, campo miembro ordinario de la clase base (nivel de ventaja paralelo, según el orden de aparición en el código Ejecución) -> Constructor de clase base -> Bloque de código ordinario de clase derivada, campo de miembro ordinario de clase derivada (nivel de ventaja paralelo, ejecutado en el orden de aparición en el código) -> Constructor de clase derivada

Verificación de código:

class Log {
    public static String initLog(String log) { System.out.println(log);return null; }
}

/**
 *  基类
*/

class Base {
    static { System.out.println("Base Static Block 1"); }

    private static String staticValue = Log.initLog("Base Static Fiels");

    static { System.out.println("Base Static Block 2"); }

    { System.out.println("Base Normal Block 1"); }

    private String value = Log.initLog("Base Normal Field");

    { System.out.println("Base Normal Block 2"); }

    Base() { System.out.println("Base Constructor"); }
}

/**
 *  派生类
 */
public class Derived extends Base {
    static { System.out.println("Static Block 1"); }

    private static String staticValue = Log.initLog("Static Fiels");

    static { System.out.println("Static Block 2"); }

    { System.out.println("Normal Block 1"); }

    private String value = Log.initLog("Normal Field");

    { System.out.println("Normal Block 2"); }

    Derived() { System.out.println("Derived Constructor"); }

/**
 *  主线程
 */

public static void main(String[] args) {
    Derived derived = new Derived();
}

控制台结果输出:

Base Static Block 1
Base Static Fiels
Base Static Block 2
Static Block 1
Static Fiels
Static Block 2
Base Normal Block 1
Base Normal Field
Base Normal Block 2
Base Constructor
Normal Block 1
Normal Field
Normal Block 2
Derived Constructor

3. Comprensión del área de método y área permanente y la relación entre ellos.

El área de método es requerida en la especificación JVM. El área permanente es la implementación específica de la máquina virtual Hotspot en el área de método. La primera es la especificación y la segunda es el método de implementación. jdk1.8 ha sido modificado. Esta pregunta examina la comprensión que tiene la otra parte de la jvm a nivel ideológico, una cuestión muy básica.

4. Un archivo java tiene 3 clases, ¿cuántos archivos de clase hay después de la compilación?

Hay varios archivos de clase en el archivo después de la compilación.

5. Las variables locales deben asignarse explícitamente antes de que se utilicen; de lo contrario, la compilación no pasará, ¿por qué está diseñada así?

Las variables miembro pueden no estar inicializadas. Puede asignarles valores predeterminados durante la fase de preparación del proceso de carga de clases, pero debe asignar explícitamente valores iniciales a las variables locales antes de que se utilicen. Javac no infiere que esto no se pueda hacer, pero no lo hace. Para las variables miembro, el orden de asignación y el acceso a los valores es incierto. Para las variables miembro, la asignación se puede realizar antes o después de llamar al método. Esto sucede en tiempo de ejecución. El compilador No estoy seguro, es más apropiado dejarlo en jvm. Para las variables locales, se determina el orden de asignación y el acceso al valor. Este diseño es una restricción para minimizar la posibilidad de que los usuarios cometan errores (si las variables locales pueden usar valores predeterminados, siempre pueden olvidarse de asignar valores sin querer, lo que lleva a situaciones inesperadas).

6. ¿ReadWriteLock es mutuamente excluyente entre lectura y escritura?

Bloqueo de lectura-escritura ReadWriteRock. Los escenarios de uso se pueden dividir en lectura / lectura, lectura / escritura y escritura / escritura. A excepción de la lectura y la lectura, que se comparten, las demás son mutuamente excluyentes. Luego, discutiremos cómo lograr la exclusión y sincronización mutuas Bloqueado, quiere saber el dominio de la otra parte de AQS, CAS y la profundidad del aprendizaje técnico.

7. ¿Semaphore es mutuamente excluyente entre subprocesos con derechos de ejecución?

Semaphore tiene el derecho de ejecutar los hilos que son mutuamente excluyentes, Semaphore, CountDownLatch, CyclicBarrier, Exchanger son las cuatro clases auxiliares de programación concurrente de Java, la diferencia entre CountDownLatch CyclicBarrier que a menudo se pregunta en las entrevistas, los entrevistadores deben encontrarse con frecuencia. Por lo tanto, no tiene sentido preguntar. Semaphore pregunta relativamente menos. Si no ha utilizado algunos puntos de conocimiento, aún lo ignorará. Semaphore puede tener múltiples bloqueos, lo que permite que varios subprocesos tengan derechos de ejecución al mismo tiempo. Estos subprocesos con derechos de ejecución son como concurrentes El acceso al mismo objeto provocará problemas de seguridad de subprocesos.

8. Escribe un patrón singleton que creas que es el mejor

Escriba un patrón único que crea que es el mejor. Es posible que el entrevistador se haya encontrado con esta pregunta. También es uno de los patrones de diseño más frecuentes en el trabajo. Quiero examinar la profundidad de la comprensión del entrevistador de los temas que se encuentran con frecuencia. Hay varias formas de implementar el ejemplo: hombre hambriento, hombre perezoso, clase interna estática, enumeración, bloqueo de doble verificación. Si escribe un hombre perezoso simple, puede preguntar: cómo garantizar la seguridad de los subprocesos en el caso de subprocesos múltiples, el entrevistador puede Hablando de cerraduras de doble verificación, luego hable sobre por qué es necesario verificar dos veces, y luego pregunte si hay algún problema solo con las cerraduras de verificación doble, luego el entrevistador con una buena base dirá: el objeto se define con la clave volátil A continuación, continuaré discutiendo la atomicidad y la visibilidad, el modelo de memoria Java y el proceso de carga de clases.

De hecho, no existe la mejor manera. Los métodos de enumeración, las clases internas estáticas y los bloqueos de verificación doble son todos posibles. Solo quiero escuchar sobre el grado de comprensión de los diferentes métodos de escritura singleton y escribir un método de bloqueo de verificación doble:

public class Singleton {
    private Singleton() {
    }

    private volatile static Singleton instance;

    public static Singleton getInstance() {
        if (null == instance) {
            synchronized (Singleton.class) {
                if (null == instance) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

}

9. ¿Qué tipo de problemas resuelven el árbol B y el árbol B +, cómo evolucionar y la diferencia entre

Árbol B y árbol B +, esta pregunta pregunta no solo el principio de realización del índice mysql, sino también la base de la estructura de datos. En primer lugar, comienza con el árbol binario. Debido al fenómeno de degradación, se propone un árbol binario equilibrado y luego cómo hacer que cada capa tenga más nodos Algunos para reducir la altura transversal, extender el árbol m-ario, el árbol de búsqueda m-ario también degenerará y conducirá al árbol equilibrado m-ario, que es el árbol B. En este momento, cada nodo tiene una clave y un valor. Cómo hacer cada nodo Cada nodo coloca tantos valores clave como sea posible para reducir la altura transversal (la cantidad de veces para acceder al disco). Puede colocar solo el valor clave para cada nodo, colocar el valor del valor en el nodo hoja y aumentar el valor del nodo hoja para apuntar al correspondiente Puntero vecino, este es el árbol B + optimizado.

Luego, hable sobre la falla del índice de la base de datos, por qué no es recomendable indexar campos de baja dispersión (como género), pero es más lento consultar datos. ¿Qué pasará si el campo de alta dispersión y el género se indexan conjuntamente? ¿Necesita atención?

10. Escribe un modelo productor-consumidor

Modo productor-consumidor, sincronizado bloquea una LinkedList, un productor, siempre que la cola no esté llena, colóquelo después de la producción, un consumidor siempre que la cola no esté vacía, recupere, los dos se coordinan a través de esperar () y notificar () Después de escribir, preguntaré cómo mejorar la eficiencia y, finalmente, hablaré sobre las ideas esenciales del diseño de colas de mensajes y su uso.

11. Escribe un punto muerto

Escriba un interbloqueo. Creo que este problema es realmente bueno. Las cuatro condiciones de interbloqueo que se mencionan a menudo se pueden memorizar. Luego, escriba un vistazo. La idea es: definir dos ArrayLists y agregarles el bloqueo A. B, los hilos 1, 2, 1 mantienen el bloqueo A, solicitan el bloqueo B y 2 mantienen el bloqueo B solicitan el bloqueo A, y nadie renunciará al bloqueo adquirido mientras espera que la otra parte lo libere.

public class DeadLock {
    public static void main(String[] args) {
        final List<Integer> list1 = Arrays.asList(1, 2, 3);
        final List<Integer> list2 = Arrays.asList(4, 5, 6);
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (list1) {
                    for (Integer i : list1) {
                        System.out.println(i);
                    }
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (list2) {
                        for (Integer i : list2) {
                            System.out.println(i);
                        }
                    }
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (list2) {
                    for (Integer i : list2) {
                        System.out.println(i);
                    }
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (list1) {
                        for (Integer i : list1) {
                            System.out.println(i);
                        }
                    }
                }
            }
        }).start();

    }
}

También existen las últimas técnicas de entrevistas para empresas de primera línea, los amigos que lo necesiten pueden hacer clic: ¡ haga clic aquí, haga clic en esto! ! , Código: csdn.

Inserte la descripción de la imagen aquí

12. Cómo ubicar la CPU al 100%

¿Cómo ubicar la cpu al 100%? Esta pregunta es una pregunta aplicada. Puedes buscarla en línea. Es relativamente común. Para ser honesto, lamento haber hecho esta pregunta.

13. Cadena a = "ab"; Cadena b = "a" + "b"; ¿Es a == b igual y por qué?

Cadena a = "ab"; Cadena b = "a" + "b"; ayb son iguales (tienes que escribir código para verificar, veo que alguien escribe la respuesta incorrecta). La pregunta convencional es asignar un nuevo objeto a una variable Pregunta: Esta línea de expresión crea varios objetos, pero estas preguntas son demasiado comunes.

14. int a = 1; ¿Es una operación atómica?

int a = 1; es una operación atómica.

15. ¿Se puede utilizar un bucle for para eliminar directamente elementos específicos de ArrayList? ¿Qué podría salir mal? Cómo resolver

Es incorrecto que un bucle for elimine directamente un elemento específico en la ArrayList. Los bucles for diferentes causarán errores diferentes. For genérico arrojará ConcurrentModificationException. For ordinario para eliminar elementos repetidos y continuos en la colección, solo puede eliminar el primero Uno.

El motivo del error : Abra el código fuente de ArrayList del JDK y observe el método remove en ArrayList (tenga en cuenta que el método remove en ArrayList tiene dos métodos con el mismo nombre, pero los parámetros de entrada son diferentes. Así es como se implementa el método remove con el parámetro de entrada Object). En circunstancias normales, la ruta de ejecución del programa irá a la ruta else y finalmente llamará al método faseRemove, y se ejecutará el método System.arraycopy, dando como resultado el movimiento del elemento de la matriz al eliminar el elemento. Por la forma incorrecta de escribir el bucle for ordinario, al atravesar la primera cadena b, debido a que se cumplen las condiciones de eliminación, el elemento se elimina de la matriz y el siguiente elemento se mueve (es decir, la segunda cadena b) a la posición actual , Dando como resultado una cadena b después de que no se atraviesa el siguiente recorrido de bucle, por lo que no se puede eliminar. En este caso, se puede evitar borrando en orden inverso

Solución : use Iterator.

 List<String> list = new  ArrayList(Arrays.asList("a", "b",  "b" , "c", "d"));
 Iterator<String> iterator = list.iterator();
       while(iterator.hasNext()) {
           String element = iterator.next();
           if(element.equals("b")) {
               iterator.remove();
           }

Ampliando esta pregunta, ¿qué podría estar mal con el siguiente código?

ArrayList<String> array = new ArrayList<String>();
array.add(1,"hello world");

16. Se envían nuevas tareas al grupo de subprocesos, ¿cómo se maneja el grupo de subprocesos?

El primer paso : el grupo de subprocesos determina si todos los subprocesos del grupo de subprocesos principales están realizando tareas. Si no es así, cree un nuevo hilo de trabajo para realizar la tarea. Si todos los subprocesos del grupo de subprocesos principales están realizando tareas, se ejecuta el segundo paso.

Paso 2 : el grupo de subprocesos determina si la cola de trabajo está llena. Si la cola de trabajos no está llena, las tareas recién enviadas se almacenan en esta cola de trabajos para esperar. Si la cola de trabajo está llena, realice el tercer paso.

El tercer paso : el grupo de subprocesos juzga si los subprocesos del grupo de subprocesos están funcionando. Si no es así, cree un nuevo hilo de trabajo para realizar la tarea. Si está lleno, se da la estrategia de saturación para manejar esta tarea.

17. Principios de AQS y CAS

Abstract Queued Synchronizer AQS (AbstractQueuedSychronizer), si la base de java.util.concurrent es CAS, entonces AQS es el núcleo de todo el paquete de concurrencia de Java, ReentrantLock, CountDownLatch, Semaphore, etc. todos lo usan.

En realidad, AQS conecta todas las entradas en forma de una cola de dos vías. Por ejemplo, ReentrantLock, todos los subprocesos en espera se colocan en una entrada y se conectan en una cola de dos vías. Si el subproceso anterior usa ReentrantLock, la cola de dos vías es en realidad la primera La entrada comienza a correr.

AQS define todas las operaciones en colas bidireccionales, pero solo abre los métodos tryLock y tryRelease para que los utilicen los desarrolladores. Los desarrolladores pueden reescribir los métodos tryLock y tryRelease de acuerdo con su propia implementación para lograr sus propias funciones concurrentes.

Compare y reemplace CAS (Compare and Swap), asumiendo que hay tres operandos: valor de memoria V, antiguo valor esperado A, valor B a ser modificado, y solo cuando el valor esperado A y el valor de memoria V sean iguales, la memoria Cambie el valor a B y devuelva verdadero, de lo contrario no haga nada y devuelva falso Toda la operación de comparación y reemplazo es una operación atómica.

CAS debe cooperar con las variables volátiles, para asegurar que las variables obtenidas cada vez sean los últimos valores correspondientes en la memoria principal, de lo contrario, el antiguo valor esperado A siempre será un valor constante A para un determinado hilo. La operación CAS falló y lo siguiente nunca se realizará correctamente.

Aunque CAS resuelve el problema de la operación atómica de manera más eficiente, todavía existen tres problemas principales.

  1. El tiempo de ciclo largo es caro.
  2. Solo se puede garantizar el funcionamiento atómico de una variable compartida.
  3. Problema de ABA.

18. Principio de aplicación subyacente sincronizado

Están involucradas dos instrucciones: monitorenter, monitorexit;

Hablemos del método de sincronización A partir de los resultados de la descompilación del método de sincronización, la sincronización del método no se realiza mediante las instrucciones monitorenter y monitorexit, en comparación con el método ordinario, el pool de constantes tiene un identificador ACC_SYNCHRONIZED.

La JVM implementa la sincronización del método basándose en este identificador: cuando se llama al método, la instrucción de llamada verificará si el indicador de acceso ACC_SYNCHRONIZED del método está establecido. Si está establecido, el hilo de ejecución obtendrá el monitor primero y el método se puede ejecutar después de que la adquisición sea exitosa. Cuerpo, suelte el monitor después de que se ejecute el método. Durante la ejecución del método, ningún otro hilo puede obtener el mismo objeto monitor.

Esta pregunta se seguirá haciendo: información del encabezado del objeto Java, bloqueos sesgados, bloqueos ligeros, bloqueos pesados ​​y su transformación mutua.

19. Función volátil, relacionada con la reordenación de la instrucción

El requisito previo para comprender el papel de la palabra clave volátil es comprender el modelo de memoria de Java. La palabra clave volátil tiene dos funciones principales:

El multiproceso se centra principalmente en 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 el último dato.

El nivel inferior de ejecución del código 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—> Se compila el código C / C ++ Lenguaje ensamblador -> interactuar con circuitos de hardware.En realidad, JVM puede reordenar instrucciones para obtener un mejor rendimiento.Pueden ocurrir problemas inesperados con subprocesos múltiples. 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 volatile es combinar con CAS para asegurar la atomicidad. Para obtener más detalles, consulte las clases del paquete java.util.concurrent.atomic, como AtomicInteger.

20. Principios de AOP y COI

AOP e IOC son la esencia de Spring. AOP puede verse como un complemento de OOP, que extiende el código horizontalmente. Se realiza a través del modo proxy. El modo proxy tiene proxy estático y proxy dinámico. Spring usa proxy dinámico. Durante la operación del programa Teje el código mejorado en el código original.

IOC es la inversión de control, que transfiere el control del objeto al marco Spring. El usuario necesita usar el objeto sin crearlo y puede usarlo directamente. Lo más valioso de AOP y IOC es su forma de pensar.

21. ¿Cómo resuelve Spring el problema de las dependencias circulares?

¿Qué es una dependencia circular y cómo detectar una dependencia circular? Hay varias formas de detectar dependencias circulares en Spring. ¿Por qué no hay ningún problema con las dependencias circulares basadas en las propiedades del setter? A continuación, preguntaré: Bean life cycle.

22. Cómo distribuye las tareas dispatchServlet

La última imagen, entiende de esta imagen.
Inserte la descripción de la imagen aquí

proceso específico:

1). El usuario envía una solicitud -> DispatcherServlet. Después de recibir la solicitud, el controlador frontal no la procesa por sí mismo, sino que la confía a otros resolutores para su procesamiento, como un punto de acceso unificado para el control global del proceso.

2) DispatcherServlet–> HandlerMapping, HandlerMapping mapeará la solicitud a un objeto HandlerExecutionChain (incluido un procesador Handler y varios interceptores HandlerInterceptor).

3) DispatcherServlet–> HandlerAdapter, HandlerAdapter empaquetará el procesador como un adaptador para admitir múltiples tipos de procesadores.

4). HandlerAdapter -> llamar al método de procesamiento de la función del procesador, HandlerAdapter llamará al método de procesamiento de la función del procesador real de acuerdo con el resultado de la adaptación, completará el procesamiento de la función y devolverá un objeto ModelAndView (incluidos los datos del modelo, el nombre de la vista lógica)

5). Nombre de la vista lógica de ModelAndView -> ViewResolver, ViewResoler resolverá el nombre de la vista lógica en una Vista específica.

6). Vista -> renderizado, la vista se renderizará de acuerdo con los datos del modelo de modelo entrante, el modelo aquí es en realidad una estructura de datos de mapa

7) Devuelve el derecho de control a DispatcherServlet y DispatcherServlet devuelve la respuesta al usuario.

23. ¿Qué problemas surgirán cuando mysql indexe campos de baja dispersión? Las razones específicas

Comencemos con la conclusión: los campos con mucha repetitividad no son adecuados para agregar índices. mysql establece un índice para campos de baja dispersión, como género, y luego las consultas con género como condición serán más lentas.

Una tabla puede incluir dos estructuras de datos (archivos), una es la propia tabla, que almacena los datos en la tabla, y la otra es un índice.

¿Qué es el índice?

Es ordenar uno o varios campos (índice combinado) según la ley, y luego adjuntar la dirección física (ubicada en la tabla) de la fila de datos donde se ubica el campo. Por ejemplo, si tenemos un campo que es la edad, si queremos seleccionar todas las filas en un cierto rango de edad, entonces es posible que se requiera un escaneo completo de la tabla en circunstancias normales. Sin embargo, si se crea un índice con este grupo de edad, se creará una matriz en el índice de acuerdo con el valor de edad de acuerdo con una estructura de datos específica, de modo que se pueda ubicar rápidamente en el índice sin un escaneo completo de la tabla.

¿Por qué el género no es adecuado para la indexación?

Dado que el acceso al índice requiere una sobrecarga de E / S adicional, todo lo que obtiene del índice es la dirección. Si realmente desea acceder a los datos, aún debe realizar una E / S en la mesa. Si desea obtener algunos datos del millón de filas de datos de la tabla, utilice el índice para localizar rápidamente, la sobrecarga de IO de acceder al índice es muy valiosa. Pero si toma 500,000 filas de datos de 1 millón de filas de datos, como el campo de género, entonces necesita acceder al índice 500,000 veces y luego acceder a la tabla 500,000 veces. La sobrecarga combinada no se comparará directamente con la tabla una vez. El escaneo completo es pequeño.

Por supuesto, si el campo de género se establece como el índice agrupado de la tabla, definitivamente acelerará la velocidad de consulta de este campo aproximadamente a la mitad. El índice agrupado se refiere al valor del campo en el que se ordenan los datos de la tabla. Por lo tanto, solo puede haber un índice agrupado y el uso del índice agrupado no pagará gastos generales de E / S adicionales. Por supuesto, debe estar dispuesto a utilizar un recurso tan valioso como el índice agrupado en el campo de género.

Puede crear un índice conjunto para el género y otros campos, como la marca de tiempo, de acuerdo con las necesidades del escenario empresarial, pero recuerde colocar el campo de marca de tiempo antes del género al crear el índice.

Añadir

  • ¿Cómo se implementa el algoritmo de replicación jvm gc?
  • El principio de anotación
  • ¿Cuáles son las formas de comunicación entre procesos?
  • ReentrantLock es una cerradura reentrante, ¿qué es una cerradura reentrante?
  • Qué sucede cuando se produce una excepción durante la ejecución del hilo y cómo solucionarlo
  • Los
    elementos put () de HashMap producen conflictos, por qué usar LinkedList (método de cremallera) en lugar de ArrayList para resolver, cuando ocurren conflictos, los valores clave son diferentes, cómo agregar nuevos elementos a la lista vinculada y por qué está diseñado así (antes de jdk1.8)
  • Escriba un modo singleton con bloqueo de doble verificación, ¿por qué usar volatile para modificar el objeto, Object object = new Object (); es el
    objeto nulo? por qué
  • Object object = new Object (); ¿Cuál es el orden de inicialización? ¿Qué se hace en cada área de la jvm?
  • Cómo se ejecutan los hilos en orden
  • verdadero o falso ?
ArrayList<Integer> list1 = new ArrayList<>(); 
ArrayList<String> list2 = new ArrayList<>();  
System.out.print(list1.getClass() == list2.getClass); 
  • La diferencia entre el bloqueo de la clase modificada y el bloqueo del método modificado
  • ¿El método method () en el siguiente código tendrá acceso mutuamente exclusivo y por qué
class A {
    public synchronized void method() {/**/}
}

new Thread(() -> { A a = new A();a.method(); }).start();
 new Thread(() -> { A b = new A();b.method(); }).start();
  • Sincronizado en la versión posterior a 1.7 qué optimización se ha hecho para mejorar la eficiencia
  • Cómo lograr la atomicidad en la base de CAS
  • El principio de la implementación del grupo de subprocesos de Java
  • Preguntas de algoritmos: algoritmos de clasificación principales (especialmente clasificación rápida y clasificación de montón), búsqueda (binaria), recorrido de árbol, DFS y BFS ...

Las 16 preguntas agregadas más adelante solo se pueden decir que son preguntas regulares, con respuestas en línea, por lo que no escribiré las respuestas aquí.

Al final

Proporcione materiales de aprendizaje de arquitectura Java gratuitos, el contenido de tecnología de aprendizaje incluye: Spring, Dubbo, MyBatis, RPC, análisis de código fuente, alta concurrencia, alto rendimiento, distribuido, optimización del rendimiento, desarrollo de arquitectura avanzada de microservicios, etc.

Los amigos que lo necesiten pueden hacer clic: ¡ haga clic aquí! ¡Haga clic en esto! , Código: csdn.

También hay puntos de conocimiento básicos de Java + un conjunto completo de materiales y videos de aprendizaje de arquitectos + libros de entrevistas de primera línea + se pueden obtener plantillas de currículum vitae de entrevistas + Preguntas de la entrevista de Ali Meituan Netease Tencent Xiaomi Iqiyi Kuaishou Bilibili + Colección de código fuente Spring + Arquitectura Java Libro electrónico práctico + últimas preguntas de la entrevista de 2020 de los principales fabricantes.
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_48011329/article/details/109403731
Recomendado
Clasificación