Sincronización con el interbloqueo de subproceso: java multithreading tres

Fuente del artículo https://www.jianshu.com/p/b913e64db7ee

Los artículos correspondientes fuente de vídeo: https://developer.aliyun.com/course/1012?spm=5176.10731542.0.0.6ef2d290hxQ4g0

Entre el procesamiento multi-hilo, puede utilizar múltiples hilos que operan los recursos Descripción Ejecutable, e hilo describir cada objeto hilo, por supuesto, cuando varios subprocesos tienen acceso a los mismos recursos si no se maneja adecuadamente, producirán los datos de operación erróneas.

Conduce a problemas de sincronización

  Escribir un programa simple pone a la venta las entradas, el número de hilos de las operaciones de tratamiento para lograr el objeto de la venta de boletos.
Ejemplo: para lograr entradas operacionales venta

class MyThread implements Runnable {
    private int ticket = 10;//总票数为10张
    @Override
    public void run() {
        while (true) {
            if (this.ticket > 0) {
                System.out.println(Thread.currentThread().getName() + "卖票,ticket = " + this.ticket--);
            } else {
                System.out.println("***** 票卖光了 *****");
                break;
            }
        }
    }
}
public class ThreadDemo {
    public static void main(String[] args) throws Exception {
        MyThread mt=new MyThread();
        new Thread(mt,"票贩子A").start();
        new Thread(mt,"票贩子B").start();
        new Thread(mt,"票贩子C").start();
    }
}

  En este punto, el programa creará tres objetos de hilo, y estos tres hilos se venden 10 boletos. En este momento, el régimen de realizar cuando la compra de entradas y no hay ningún problema (artefactos), la siguiente operación puede simular lo que retrasa el billete.

class MyThread implements Runnable {
    private int ticket = 10;//总票数为10张
    @Override
    public void run() {
        while (true) {
            if (this.ticket > 0) {
                try {
                    Thread.sleep(100);//模拟网络延迟
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "卖票,ticket = " + this.ticket--);
            } else {
                System.out.println("***** 票卖光了 *****");
                break;
            }
        }
    }
}

 Este retardo de tiempo se añade al problema está expuesto, y de hecho este tema ha estado en.

 

sincronización hilo

  La razón principal se puede determinar después de análisis ha producido un problema de sincronización, entonces necesitaría el siguiente para resolver el problema de sincronización, pero la clave para resolver el problema es a la cerradura, se hace referencia al tiempo en que un hilo para llevar a cabo una operación, otros hilos esperando fuera;

 Para implementar la función de bloqueo de programa puede ser utilizado para absorber palabra clave sincronizada, usando el método de sincronización y una sincronización sincronizado bloques de código pueden ser definidos, el código de operación en el bloque de sincronización permite que sólo un hilo de ejecución.
1, el bloque de código de sincronización usando las siguientes condiciones:

synchronized (同步对象){
    同步代码操作;
}

 Cuando el objeto es en general al procesamiento de la sincronización, la sincronización se puede realizar utilizando el objeto actual esto.
  Ejemplo: sincronización de datos problemas de acceso bloque de código síncronos para resolver

class MyThread implements Runnable {
    private int ticket = 1000;//总票数为10张
    @Override
    public void run() {
        while (true) {
            synchronized (this) {//每一次只允许一个线程进行访问
                if (this.ticket > 0) {
                    try {
                        Thread.sleep(100);//模拟网络延迟
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "卖票,ticket = " + this.ticket--);
                } else {
                    System.out.println("***** 票卖光了 *****");
                    break;
                }
            }
        }
    }
}
public class ThreadDemo {
    public static void main(String[] args) throws Exception {
        MyThread mt = new MyThread();
        new Thread(mt, "票贩子A").start();
        new Thread(mt, "票贩子B").start();
        new Thread(mt, "票贩子C").start();
    }
}

  Después de la adición del proceso de sincronización, el rendimiento global del programa se redujo. Sincronización de hecho dará lugar a una disminución del rendimiento .
2, utilizando el método de sincronización para resolver: sólo tiene que utilizar la palabra clave sincronizada se puede definir en el método.

class MyThread implements Runnable {
    private int ticket = 10;//总票数为10张
    public synchronized boolean sale() {
        if (this.ticket > 0) {
            try {
                Thread.sleep(100);//模拟网络延迟
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "卖票,ticket = " + this.ticket--);
            return true;
        } else {
            System.out.println("***** 票卖光了 *****");
            return false;
        }
    }
    @Override
    public void run() {
        while (this.sale()) {}
    }
}
public class ThreadDemo {
    public static void main(String[] args) throws Exception {
        MyThread mt = new MyThread();
        new Thread(mt, "票贩子A").start();
        new Thread(mt, "票贩子B").start();
        new Thread(mt, "票贩子C").start();
    }
}

 En el aprendizaje de las bibliotecas de clases de Java futuro, es un método de sincronización utiliza el sistema de procesamiento síncrono utilizado en muchas clases.

punto muerto

  Interbloqueo está en marcha multithreading sincronización hay un problema que pueda surgir, llamado punto muerto se refiere al número de hilos en espera de cada otro estado.

public class DeadLock implements Runnable {
    private Producer producer = new Producer();
    private Customer customer = new Customer();
    public DeadLock() {
        new Thread(this).start();
        customer.say(producer);
    }
    public static void main(String[] args) {
        new DeadLock();
    }
    @Override
    public void run() {
        producer.say(customer);
    }
}
class Producer {
    public synchronized void say(Customer customer) {
        System.out.println("店员:先买单后吃饭");
        customer.get();
    }
    public synchronized void get() {
        System.out.println("收到钱,可以给你做饭了");
    }
}
class Customer {
    public synchronized void say(Producer producer) {
        System.out.println("顾客:先吃饭后买单");
        producer.get();
    }
    public synchronized void get() {
        System.out.println("吃饱饭了,可以买单了");
    }
}

 La razón principal es porque el actual punto muerto causado todos esperando el uno al otro, esperando que el otro para dejar salir los recursos. Estancamiento es en realidad estado incierto de un desarrollo que aparece, a veces código no maneja adecuadamente, lo hará de vez en punto muerto tiempo, que es un problema de la depuración de desarrollo normal.
  Asegúrese de sincronizar cuando un número de hilos de acceder al mismo recurso, pero en exceso provocará estancamiento de sincronización.

 

 

 

Publicado 52 artículos originales · ganado elogios 7 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/YKWNDY/article/details/104644565
Recomendado
Clasificación