NMP-Study / EffectiveJava2018

Effective Java Study
9 stars 0 forks source link

아이템 81. WAIT와 NOTIFY보다는 동시성 유틸리티를 애용하라 #81

Closed madplay closed 5 years ago

duckcalf commented 5 years ago

예전에는 wait와 notify가 의미가 있었지만, 이제 java.util.concurrent가 매우 좋음으로, 왠만하면 이걸 쓰자.

java.util.concurrent는 세 범주로 나뉘어질 수 있다.

동시성 컬렉션

map

public static String intern(String s) { String previousValue = map.putIfAbsent(s, s); return previousValue == null ? s : previousValue; }

- 기존 Collections.synchronizedMap 보다는 ConcurrentHashMap을 사용하는게 훨신 좋음으로, 새거 쓰자.

#### queue
- BlockingQueue에 추가된 메서드중 take는 큐의 첫 원소를 꺼내는데, 만약 큐가 비어 있으면, 큐가 추가될때까지 기다린다.
- 기존에 큐가 존재하는지 확인하고, 없으면 기다렸다가 루프를 도는등의 처리가 필요가 없다.
- ThreadPoolExecutor를 포함한 대부분의 실행자 서비스(아이템 #80) 구현체에서 BlockingQueue를 사용한다.

### 동기화 장치
- CountDownLatch : 아래는 action을 concurrency만큼을 동시에 실행했을때 걸리는 총 시간을 계산하는 method
```Java
public static long time(Executor executor, int concurrency, Runnable action) throws InterruptedException {
  CountDownLatch ready = new CountDownLatch(concurrency);
  CountDownLatch start = new CountDownLatch(1);
  CountDownLatch done = new CountDownLatch(done);

  for (int i = 0; i < concurrency; i++) {
    executor.execute(() -> {
      ready.countDown();
      try {
        start.await();
        action.run();
      }  catch (InterruptedException e) {
        Thread.currentThread().interrupt();
      } finally {
        done.countDown();
      }
    });
  }

  ready.await();
  long startNanos = System.nanoTime();
  start.countDown();
  done.await();
  return System.nanoTime() - startNanos;
}

wait, notify

madplay commented 5 years ago

currentTimeMillis()

nanoTime()