Dos, java multithreading base segura para los subprocesos tanto como resumen y análisis

En primer lugar, el hilo de seguridad por qué hay

1. Cuando varios hilos comparten las mismas variables globales o variables estáticas cuando se realiza una operación de escritura, los datos pueden entrar en conflicto es un problema de seguridad se produce hilo. Pero no leídos se producen conflictos de datos.

En segundo lugar, ejemplos de código

1. Código

public class ThreadTrain implements Runnable {
    private int trainCount = 100;
    @Override
    public void run() {
        while (trainCount > 0) {
            try {
                Thread.sleep(500);
            } catch (Exception e) {

            }
            sale();
        }
    }
    public void sale() {
        if (trainCount > 0) {
            System.out.println(Thread.currentThread().getName() + ",出售第" + (100 - trainCount + 1) + "张票");
            trainCount--;
        }
    }
    public static void main(String[] args) {
        ThreadTrain threadTrain = new ThreadTrain();
        Thread t1 = new Thread(threadTrain, "①号");
        Thread t2 = new Thread(threadTrain, "②号");
        t1.start();
        t2.start();
    }
}

2. resultados

3. Analizar

Una ventana y la ventana número dos, mientras que la venta de entradas, algunas entradas se repiten para la venta , cuando las conclusiones encontraron que múltiples hilos comparten la misma variable miembro mundial, hacer la operación de escritura de datos puede que se produce un conflicto.

solución tercer lugar, thread-safe

1. síncrono o sincronizado usando la cerradura (cerradura), los datos pueden entrar en conflicto (rosca cuestión seguro) ocurrirá entre múltiples hilos, un hilo sólo puede hacer que la ejecución actual. Después de la finalización de la aplicación del código para liberar el bloqueo, por lo que después de dejar que otros hilos de ejecución. En este caso se puede resolver el problema de la inseguridad hilo.

2. Construido con el bloqueo de palabras clave sincronizada para lograr, sincronizado de palabras clave de dos maneras:

2.1. Modificaciones necesita ser sincronizado método (método para acceder a todas las variables de estado deben estar sincronizados), a continuación, actúa como un objeto de bloqueo como teniendo invocación método de sincronización

2.2 bloque sincronizado y sincronizada directamente modificado usando los métodos que requieren sincronización son los mismos, pero la granularidad de bloqueo puede ser más fino, y actúa como un bloqueo no es necesariamente el este objeto, otros objetos pueden ser, es más flexible para su uso.

2.3 Cada objeto Java puede ser utilizado para lograr un bloqueo sincronizado, conocido como el incorporado en la cerradura, la cerradura antes de que el hilo automáticamente entrar en el bloque sincronizado, un bloque de código para realizar salida normal o bloqueo completo del código lanzará una salida excepción liberado cerradura, una función de bloqueo para el mutex, que es, después de hilo un adquiere un bloqueo, hilo B a bloqueado hasta que se suelte el bloqueo de hilo, el hilo B a fin de obtener la misma cerradura.

3. Código (método de sincronización, otros métodos serán omitidas)

public class ThreadTrain implements Runnable {
    private int trainCount = 100;
    @Override
    public void run() {
        while (trainCount > 0) {
            try {
                Thread.sleep(500);
            } catch (Exception e) {

            }
            sale();
        }
    }
    public synchronized void sale() {
        if (trainCount > 0) {
            System.out.println(Thread.currentThread().getName() + ",出售第" + (100 - trainCount + 1) + "张票");
            trainCount--;
        }
    }
    public static void main(String[] args) {
        ThreadTrain threadTrain = new ThreadTrain();
        Thread t1 = new Thread(threadTrain, "①号");
        Thread t2 = new Thread(threadTrain, "②号");
        t1.start();
        t2.start();
    }
}

3.1. Los resultados (resultado normal)

①号,出售第1张票
②号,出售第2张票
①号,出售第3张票
②号,出售第4张票
①号,出售第5张票
②号,出售第6张票
①号,出售第7张票

Cuatro, el uso ThreadLocal

1.ThreadLocal mejorar una variable local de rosca, para acceder a un hilo tiene sus propias variables locales (cada hilo tiene uno).

2. Al utilizar mantenimiento variable de ThreadLocal, ThreadLocal proporcionan para cada hilo utilizando la copia variable independiente variable, cada hilo puede cambiar de forma independiente su copia sin afectar a otros hilos de copia correspondientes.

3. Código

class Res {
    // 生成序列号共享变量
    public static Integer count = 0;
    public static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() {
        protected Integer initialValue() {
            return 0;
        };
    };
    public Integer getNum() {
        int count = threadLocal.get() + 1;
        threadLocal.set(count);
        return count;
    }
}
public class ThreadLocaDemo2 extends Thread {
    private Res res;

    public ThreadLocaDemo2(Res res) {
        this.res = res;
    }
    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println(Thread.currentThread().getName() + "---" + "i---" + i + "--num:" + res.getNum());
        }
    }
    public static void main(String[] args) {
        Res res = new Res();
        ThreadLocaDemo2 threadLocaDemo1 = new ThreadLocaDemo2(res);
        ThreadLocaDemo2 threadLocaDemo2 = new ThreadLocaDemo2(res);
        ThreadLocaDemo2 threadLocaDemo3 = new ThreadLocaDemo2(res);
        threadLocaDemo1.start();
        threadLocaDemo2.start();
        threadLocaDemo3.start();
    }
}

4. resultados

Thread-0---i---0--num:1
Thread-0---i---1--num:2
Thread-0---i---2--num:3
Thread-2---i---0--num:1
Thread-2---i---1--num:2
Thread-2---i---2--num:3
Thread-1---i---0--num:1
Thread-1---i---1--num:2
Thread-1---i---2--num:3

En quinto lugar, el final de la

1. Hoy en día, esta parada aquí! ! !

Publicados 122 artículos originales · ganado elogios 64 · Vistas a 50000 +

Supongo que te gusta

Origin blog.csdn.net/chenmingxu438521/article/details/103763169
Recomendado
Clasificación