《자바 병행 프로그래밍 실전》 독서노트-제5장 기초 구축 모듈

3768 단어

동기화 컨테이너 클래스


동기화 용기 클래스가 라인을 안전하게 하는 방식: 모든 상태를 봉인하고 모든 공유 방법에 동기화를 사용하여 한 번에 한 라인만 접근할 수 있도록 합니다.동기화 컨테이너 클래스는 Vector, Hashtable, Collections로 구성됩니다.synchronizedXXX 등
** 동기화 용기 클래스의 문제 **
  • 복합 조작 원자성은 클라이언트가 잠금 제어를 해야 한다
  • 매 조작마다 하나의 자물쇠를 가지고 용기 규모가 큰 상황에서 자물쇠를 너무 오래 가지고 경쟁이 치열하면 시스템 수송량과 CPU 이용률을 낮출 수 있다
  • 병렬 컨테이너


    ConcurrentHashMap
  • 입도가 더 가는 세그먼트 자물쇠를 통해 데이터 공유
  • size와 isEmpty 등 전체 맵에서 계산해야 하는 방법은 귀환 결과는 예비 평가
  • 일부 일반적인 작업은 ConcurrentMap 인터페이스에 명시되어 직접 사용할 수 있습니다.예를 들어 "없으면 추가", "같으면 제거", "같으면 교체"
  • CopyOnWriteArrayList
  • 쓰기 시 복사 (Copy-on-Write) 의 루틴 보안: 사실적으로 변할 수 없는 대상을 초기화합니다.
  • 교체 중ConcurrentModificationException
  • 을 던지지 않습니다
  • 이벤트 알림 시스템에 비교적 적합하다. 알림을 나누어 줄 때 이미 등록된 감청기 체인 테이블을 교체하고 모든 감청기를 호출해야 한다. 대부분의 경우 이벤트 감청기를 등록하고 취소하는 작업은 이벤트 알림을 받는 작업보다 훨씬 작다
  • 차단 방법과 중단 방법


    스레드가 막히는 원인은 일반적으로 입출력 대기, 잠금 대기, Thread 입니다.sleep, 다른 스레드 계산 결과를 기다리는 스레드 막힘 상태: BLOCKED,WAITING,TIMEDWAITING 스레드 중단: Thread.interrupt () 는 라인 중단 상태를 조회할 수 있습니다.

    동기화 도구 클래스


    ** 폐쇄 **
  • 폐쇄(Latch): 동기화 방법으로 라인이 어느 종점 상태에 도달할 때까지 진도를 늦출 수 있다.통속적으로 말하면 하나의 폐쇄는 하나의 대문에 해당한다. 대문이 열리기 전에 모든 노선이 차단되고 일단 대문이 열리면 모든 노선이 통과된다. 그러나 일단 대문이 열리면 모든 노선이 통과된다. 그러면 이 폐쇄 상태는 효력을 잃고 문의 상태도 변할 수 없고 열려 있는 상태만 된다.즉 폐쇄 상태는 일회성으로 폐쇄가 열리기 전에 모든 특정한 활동이 폐쇄가 열리고 나서야 완성될 수 있음을 확보한다
  • 폐쇄는 일회성 대상이며 일단 종료 상태에 들어가면 리셋될 수 없다.CountDownLatch
  • Count Down Latch는 JDK 5+에서 폐쇄된 것으로 한 개 이상의 라인이 어떤 사건의 발생을 기다릴 수 있도록 허용한다.
  • CountDownLatch에는 정수 계수기가 있는데,countDown 방법은 계수기에 대해 감작업을 하고,await 방법은 계수기가 0에 이르기를 기다린다.계수기가 0이 되거나 대기 라인이 끊기거나 시간이 초과될 때까지 모든 await의 라인이 막힙니다.

  • FutureTask
  • FutureTask는 취소할 수 있는 비동기적인 계산이다.FutureTask는Future의 기본적인 방법을 실현하고 start cancel 조작을 비워 계산이 완성되었는지 조회할 수 있으며 계산 결과를 얻을 수 있다.결과는 계산이 끝난 후에만 얻을 수 있으며 get 방법은 계산이 완성되지 않았을 때 계산이 완료되면 다시 시작하거나 취소할 수 없습니다.
  • FutureTask 도 폐쇄 상태로 사용할 수 있습니다.

  • ** 신호량 **
  • 계수 신호량은 자원에 동시에 접근하는 작업 수량을 제어하고 특정한 작업을 수행하는 수량을 제어하는 데 사용된다.
  • 잠금 메커니즘과 일정한 유사성이 존재하고semaphore도 잠금 메커니즘이다. 다른 것은 ReentrantLock은 한 라인만 잠금을 허용하고 신호량은 여러 개의 허가(permits)를 가지고 여러 라인이 허가를 받고 집행하도록 허용한다.특정 자원에 동시에 접근하는 작업 수량을 제어하거나 특정한 작업을 동시에 수행하는 수량을 제어할 수 있습니다.
  • Semaphore 초기값이 1로 설정되어 상호 배척 잠금
  • 으로 사용 가능
    ** 울타리**
  • 울타리는 폐쇄와 유사하며 어떤 사건이 발생할 때까지 라인을 막을 수 있다.울타리와 폐쇄의 관건적인 차이점은 모든 노정이 동시에 울타리 위치에 도달해야만 계속 집행할 수 있다는 것이다.폐쇄는 이벤트를 기다리는 데 사용되고, 울타리는 다른 라인을 기다리는 데 사용됩니다.

  • 효율적이고 신축 가능한 결과 캐시 구축

    public interface Computable{
    V compute(A arg) throws InterruptedException;
    }
    public class ExpensiveFunction implements Computable {
    @Override
    public BigInteger compute(String arg) throws InterruptedException {
    //장시간의 계산을 거친 후
    return new BigInteger(arg);
    }
    }
    public class Memoizerimplements Computable{
    private final Map> cache = new ConcurrentHashMap<>();
    private final Computablec;
    public Memoizer(Computablec) {
    this.c = c;
    }
    public V compute(A arg) {
    Future f = cache.get(arg);
    if (f == null) {
    Callable eval = new Callable() {
    @Override
    public V call() throws Exception {
    return c.compute(arg);
    }
    };
    FutureTask ft = new FutureTask<>(eval);
    f = cache.putIfAbsent(arg, ft);
    if (f == null) {
    f = ft;
    ft.run();
    }
    }
    try {
    return f.get();
    } catch (InterruptedException e) {
    e.printStackTrace();
    } catch (ExecutionException e) {
    e.printStackTrace();
    }
    return null;
    }
    }

    좋은 웹페이지 즐겨찾기