mecanismo de sincronización hilo Java

  1. Antecedentes
    Ejemplo: Crear una ventana para vender entradas, el número total de votos para la 100 que implementan la interfaz de manera Ejecutable

1. Problema: el proceso de venta de entradas, ha habido voto pesada, voto equivocado -> ha habido problemas de seguridad de rosca
2. Las causas del problema: cuando un proceso hilo de las operaciones de venta de entradas, una vez terminado, la operación no ha estado involucrado en otros hilos entrar, también opera un boleto.
3. ¿Cómo arreglarlo: Cuando un hilo de un billete en el momento de la operación, otros hilos no puede involucrarse. Cuando un hilo hasta que la operación se completa la compra de entradas, otros hilos pueden comenzar billete operación. Esto ocurrió incluso un hilo bloqueado y no se puede cambiar.

  1. Solución de Java: los mecanismos de sincronización

En Java, pasamos mecanismo de sincronización de hilo solucionar problemas de seguridad.

//方式一:同步代码块

  synchronized(同步监视器){
      //需要被同步的代码

   }

Descripción:

  • 1. El código de operación de los datos compartidos, el código que se va a sincronizar. -> no puede contener código para más, y no puede contener menos código.
  • 2. Los datos compartidos: Variable múltiples hilos co-operación. Por ejemplo: la entrada es el intercambio de datos.

  • 3. monitor de Sincronizar, conocido comúnmente como: cerradura. Cualquier objeto de una clase, puede actuar como un bloqueo.

     要求:多个线程必须要共用同一把锁。
    

Añadido: En implementar Ejecutable crear múltiples hilos, podemos considerar este acto como monitores de sincronización.
herencia de clases de hilo para crear el modo multi-hilo, esto actúa como un monitores de sincronización utilizados con precaución, dado el acto de la clase actual como monitores de sincronización.

Segunda manera: método de sincronización
si los datos de código compartido en un método de funcionamiento declaración completa, que así podrían declarar este método sincronizado.

Sobre el método de sincronización Resumen:

  1. Método de sincronización todavía implica la sincronización del monitor, pero no es necesario declarar explícitamente.
  2. método no estático de sincronización es monitor de sincronización: el este
    método estático de sincronización es monitor de sincronización: la propia clase actual

Tres maneras: Lock Lock - JDK5.0 nuevas

  1. Preguntas de la entrevista: sincronizada y bloqueo de las similitudes y diferencias?
  • Lo mismo: ambos pueden resolver los problemas de seguridad hilo
  • Diferentes: mecanismos sincronizados han realizado después de que el código de sincronización correspondiente, el monitor de sincronización liberar automáticamente
  • Bloquear la necesidad de iniciar manualmente la sincronización (bloqueo (), al mismo tiempo, también es necesario sincronizar manualmente el final de la ejecución (de desbloqueo ())

Uso de prioridad:
Lock -> bloque de sincronización (ha entrado en el cuerpo del método de la asignación del recurso correspondiente) ->  método de sincronización (Método fuera del cuerpo)

  1. Pros y los contras de
    una manera sincronizada para resolver el problema de hilo de seguridad. - Beneficios
    Operación código de sincronización, sólo puede participar en un hilo, otros subprocesos esperan. El equivalente de un proceso de un solo subproceso es ineficiente.

  2. Preguntas de la entrevista: Java es la forma de resolver los problemas de seguridad hilo, hay varias maneras? Y comparar las diferentes formas de

Contrasta de manera sincronizada y bloqueo seguro para subprocesos para resolver el problema: preguntas cara


Hilo de seguridad Singleton - hombre perezoso
utilizando un único mecanismo de sincronización en la caja fuerte hilo perezoso modo de realización reescrito.

class Bank{

    private Bank(){}

    private static Bank instance = null;

    public static Bank getInstance(){
        //方式一:效率稍差
//        synchronized (Bank.class) {
//            if(instance == null){
//
//                instance = new Bank();
//            }
//            return instance;
//        }
        //方式二:效率更高
        if(instance == null){

            synchronized (Bank.class) {
                if(instance == null){

                    instance = new Bank();
                }

            }
        }
        return instance;
    }

}

Preguntas de la entrevista: escribir un producto único seguro para subprocesos.
estilo hombre hambriento.
Lazy fórmula: proporcionado anteriormente.


Punto muerto
1. interbloqueo comprenden :
diferentes hilos están ocupados por otros recursos requeridos para sincronizar no renunciar, están a la espera para el otro para dar recursos de sincronización que necesitan para formar un interbloqueo de subproceso

2. Descripción :

  • 1 Después del punto muerto, no parece anormal, mensaje no aparecerá, pero las roscas están en el estado bloqueado no puede continuar
  • 2 Utilizamos la sincronización de estancamiento evitar.

3. Por ejemplo :

public static void main(String[] args) {

    StringBuffer s1 = new StringBuffer();
    StringBuffer s2 = new StringBuffer();


    new Thread(){
        @Override
        public void run() {

            synchronized (s1){

                s1.append("a");
                s2.append("1");

                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }


                synchronized (s2){
                    s1.append("b");
                    s2.append("2");

                    System.out.println(s1);
                    System.out.println(s2);
                }


            }

        }
    }.start();


    new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (s2){

                s1.append("c");
                s2.append("3");

                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                synchronized (s1){
                    s1.append("d");
                    s2.append("4");

                    System.out.println(s1);
                    System.out.println(s2);
                }


            }



        }
    }).start();


}
Publicado 73 artículos originales · ganado elogios 0 · Vistas 1238

Supongo que te gusta

Origin blog.csdn.net/qq_38605145/article/details/105105678
Recomendado
Clasificación