Cepillo preguntas de la entrevista 19: ¿Qué herramientas de concurrencia kit?

image.png


paquete java.util.concurrent ofrece un gran número de herramienta concurrente.


Hola a todos, soy Li Fuchun, los temas son:

las herramientas Java proporcionan concurrente ¿Qué?

R: kit de herramientas java.util.concurrent proporcionado en cuatro categorías.

A las herramientas de sincronización, CountDownLatch, CyclicBarrier, Semáforo;
dos, contenedores de concurrencia de fallos, de ConcurrentHashMap, un ConcurrentSkipListMap,
un CopyOnWriteArrayList, CopyOnWriteArraySet;
tres, de colas de concurrencia-seguro, utilizado principalmente en el grupo de subprocesos, ArrayBlockingQueue, SynchronousQueue, PriorityBlockingQueue;
cuatro hilo concurrente marco piscina ejecutor ;


Herramienta de sincronización

semáforo


Los semáforos, el acceso simultáneo para establecer el número de hilos.

Par utiliza generalmente: try {s.acquire ();} finally {s.release ()}

package org.example.mianshi.synctool;

import java.util.concurrent.Semaphore;

/**
 * 创建日期:  2020/3/30 14:24
 * 描述:     信号量应用
 *
 * @author lifuchun
 */

public class SemaphoreApp {


    public static void main(String[] args) {

        Semaphore semaphore = new Semaphore(0);

        for (int i = 1; i <= 10; i++) {
            new MyThread(semaphore).start();
        }

        System.out.println("go ```");
        semaphore.release(5);


    }

    public static class MyThread extends Thread {

        private Semaphore semaphore;

        public MyThread(Semaphore semaphore) {
            this.semaphore = semaphore;
        }

        @Override
        public void run() {

            try {

                semaphore.acquire();

                System.out.println(System.currentTimeMillis() + " :" + Thread.currentThread().getName() + " -execute ```");

            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaphore.release();
            }


        }
    }


}复制代码

CountDownLatch


un conjunto de espera de hilo para la realización de ciertas operaciones;

otros acabados hilo, llamada c.countDown ()

método cuando el valor de c = 0, es decir, otros hilos a ejecutar () de la lógica detrás esperan.

package org.example.mianshi.synctool;

import java.util.concurrent.CountDownLatch;
import java.util.stream.IntStream;

/**
 * 创建日期:  2020/3/30 14:38
 * 描述:     countDownLatch的例子
 * @author lifuchun
 */

public class CountDownLatchApp {

    public static void main(String[] args) {

        CountDownLatch countDownLatch = new CountDownLatch(5);

        new Thread(() -> {

            try {
                countDownLatch.await();

                System.out.println("后置任务");


            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();


        IntStream.rangeClosed(1, 10)
                .forEach(i -> new MyThread(countDownLatch).start());


    }

    public static class MyThread extends Thread {

        private CountDownLatch countDownLatch;

        public MyThread(CountDownLatch countDownLatch) {
            this.countDownLatch = countDownLatch;
        }

        @Override
        public void run() {

            countDownLatch.countDown();

            System.out.println("前置任务");


        }
    }

}复制代码

CyclicBarrier


Permite múltiples hilos alcanzan simultáneamente una barrera. Ajuste el número de hilos se ejecutan simultáneamente.

Por lo general, el método llamado Await (), cuando el número alcanza el número N predeterminado, la lógica de ejecución unificado detrás del método esperan ser (), se restablecerá automáticamente.

package org.example.mianshi.synctool;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.stream.IntStream;

/**
 * 创建日期:  2020/3/30 14:49
 * 描述:     cyclicBarrier的应用
 *
 * @author lifuchun
 */

public class CyclicBarrierApp {

    public static void main(String[] args) {

        CyclicBarrier cyclicBarrier = new CyclicBarrier(3, CyclicBarrierApp::run);

        IntStream.rangeClosed(1, 30)
                .forEach(i -> new MyThread(cyclicBarrier).start());

    }

    private static void run() {
        System.out.println("reset , start again !");
    }

    public static class MyThread extends Thread {

        private CyclicBarrier cyclicBarrier;

        public MyThread(CyclicBarrier cyclicBarrier) {
            this.cyclicBarrier = cyclicBarrier;
        }

        @Override
        public void run() {

            try {
                cyclicBarrier.await();
            } catch (InterruptedException | BrokenBarrierException e) {
                e.printStackTrace();
            }

            System.out.println("do my work!");

        }
    }

}复制代码

image.png


contenedor seguro Sincronización


jerarquía de clases, como se muestra a continuación:
image.png



Selección de escena:

1, si se coloca el foco y la velocidad de adquisición simultánea, el uso de ConcurrentHashMap; 

2, si la secuencia de enfoque, y una gran cantidad de datos de modificación concurrentes con frecuencia, utilizando un ConcurrentSkipListMap


copy-on-write * Defensa replicación:

el ADD, SET operación remota copiará la matriz original, en sustitución de la matriz original después de completar los cambios, el precio es relativamente grande, adecuado para la lectura y escritura de pequeñas escenas;



resumen


Benpian respondió java.util.concurrent introduce clasificación kit de herramienta de tres herramienta de sincronización, Semáforo, CountDownLatch, CyclicBarrier;

a continuación, la jerarquía de clases se muestra en recipientes de concurrencia-safe FIG, analizaron cómo diferentes escenarios seleccionar el contenedor seguro concurrente apropiado.


image.png

El original no es fácil, por favor indique la fuente, vamos a la complementariedad y el progreso común, elogiaron la Comunicación.

Supongo que te gusta

Origin juejin.im/post/5e819ea5e51d45471654fc16
Recomendado
Clasificación