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!");
}
}
}复制代码
contenedor seguro Sincronización
jerarquía de clases, como se muestra a continuación:
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.
El original no es fácil, por favor indique la fuente, vamos a la complementariedad y el progreso común, elogiaron la Comunicación.