브러쉬 (19) 인터뷰 질문 : 어떤 도구 동시성 키트를?

의 image.png


java.util.concurrent의 패키지는 동시 도구의 큰 숫자를 제공합니다.


모두 안녕하세요, 리 푸춘은 주제입니다, 해요 :

자바 도구는 무엇 동시 제공?

A : 네 가지 범주로 제공 java.util.concurrent의 도구 키트.

동기화 도구 CountDownLatch를,으로 CyclicBarrier 세마포어;
개의 동시성 안전 용기 ConcurrentHashMap을하는 ConcurrentSkipListMap과의
으로 CopyOnWriteArrayList, CopyOnWriteArraySet;
세 동시성 안전 큐 주로 ArrayBlockingQueue를, SynchronousQueue는, 인 PriorityBlockingQueue 스레드 풀의 사용;
네 동시 스레드 풀 실행기 프레임 ;


동기화 도구

신호기


세마포어는 동시 액세스가 스레드의 수를 설정합니다.

쌍은 일반적으로 사용 : {s.acquire를 ();} 시도 마침내 {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를


특정 작업의 완료에 대해 설정된 대기 스레드,

다른 스레드가 완료 콜 c.countDown ()

AWAIT 뒤에 논리 값 C = 0, 즉, 다른 스레드가 실행하는 경우 () 메소드.

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


여러 스레드가 동시에 장벽에 도달 할 수 있습니다. 동시에 실행되는 스레드의 수를 설정합니다.

횟수가 설정 횟수 N은 AWAIT () 메소드 뒤에 통합 실행 논리 도달 할 때 보통 AWAIT ()를 호출하는 방법을 자동으로 재설정 할 것이다.

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


동기화 보안 컨테이너


: 아래 그림과 같이 클래스 계층 구조
의 image.png



장면 선택 :

; 초점이 배치되는 경우, (1) 동시 수집 속도, ConcurrentHashMap의 사용 

이, 초점 순서 및 ConcurrentSkipListMap과 사용 빈도 동시 변경 데이터의 많은 수의 경우


CopyOnWrite * 복제 방어 :

추가, SET를, 변경이 완료된 후 원격 동작이 가격이 작은 장면을 판독 및 기록을위한 비교적 큰 적합 원의 배열을 교체 원의 배열에 복사한다;



개요


Benpian가 java.util.concurrent의 도구 키트 분류 컨덕터 세 동기화 도구 답변 세마포어, CountDownLatch를,으로 CyclicBarrier는,

다음도 병행 방지 용기에 도시 된 클래스 계층이 어떻게 다른 시나리오 분석 해당 동시 안전한 컨테이너를 선택합니다.


의 image.png

원래는 소스를 나타냅니다 우리 보완 및 일반 진행, 통신을 환영 주시기 바랍니다, 쉬운 일이 아니다.

추천

출처juejin.im/post/5e819ea5e51d45471654fc16