java-concurrency icon indicating copy to clipboard operation
java-concurrency copied to clipboard

java concurrency 예제 정리

Java concurrency 예제

예제 출처

장별 예제 정리 링크

3. java.lang.Thread 바로 알기

  • 쓰지 말아야할 것: Thread.stop
    • PrimeGenerator.java : 협력적으로 Thread를 멈추는 방식
  • 잘 알고 쓸 것 : Thread.interrupt
    • SelfInterruption.java : Thread.interrupted()의 혼란성을 보여줌
    • BrokenPrimeProducer.java : BlockingQueue가 blocking되어 있으면 중지되지 않는 쓰레드
    • PrimeProducer.java : interrupt로 중지할 수 있는 쓰레드

4. 동기화와 가시성

  • Sychronized
    • NonreentrantDeadlock.java : synchronized 키워드에 의한 lock은 재진입가능하다는 것을 보여줌
    • SyncDemo.java : synchronized로 선언된 Block이 동시에 실행되지 못함을 보여줌.
    • PingPong.java : static method의 syncronized 키워드의 동작방식을 보여줌.
  • 가시성 확보
    • StopThread.java(Broken) : static 변수이지만 가시성 확보가 안 되어서 한 스레드에서 write한 값이 다른 thread에서 안 보이는 현상을 보여줌.
    • StopThread.java(Fix1) : 가시성 문제를 synchronized 메소드를 이용해서 동기화 시켜서 해결
    • StopThread.java(Fix2) : 가시성 문제를 volatile 키워드를 이용해서 해결
    • Worker.java : 가시성 확보, 동기화를 모두 했음에도 Thread.join이 호출되면 예상치 못한 동작이 발생함을 보여줌

5. Java concurrent API

  • Executors
    • TimingThreadPool.java : ThreadPoolExecutor를 확장해서 시간측정 로깅 기능을 추가한 예제
  • Callable
    • Preloader.java : Callable, FutureTask , Thread 생성, Future.get의 사용예.
  • java.util.concurrent.locks패키지
    • ReadWriterMap.java : ReadWriteLock을 활용해서 Map을 동기화한 사례
  • CountDownLatch
    • TestHarness.java : CountDownLatch를 이용해서 여러 쓰레드로 작업을 실행하고, 최종 종료시간을 구함
    • ConcurrentTimer.java : TestHarness와 유사한 역할이나 스레드 생성 후에 실행되는 구간을 측정하기 위해 단계를 하나 더 두었음.
  • Semaphore
    • BoundedHashSet.java : counting semaphore를 활용해 제한된 크기의 Set을 구현함.
  • 다양한 동기화 방식
    • CounterDemo.java : Counter의 동작을 확인하는 클래스
    • LockingCounter.java : WriteLock을 이용한 Counter
    • SynchronizedCounter.java : synchronized 키워드를 이용한 클래스
    • AtomicCounter.java : AtomicInteger를 이용한 클래스

6. Thread 안전 클래스

  • Iterator

    • IteratorAccessor.java : java.util.ConcurrentModificationException를 드러내주는 예제
    • HiddenIterator.java : Iterator를 명시적으로 호출하지 않았는데도 문제가 되는 경우
    • HiddenIteratorAccessor.java : HiddenIterator의 에러를 드러내주는 클래스
  • BlockingQueue

    • PlainProsumer.java : wait, notify를 이용한 큐
    • BlockingProsumer.java : BlockingQueue를 이용
  • Atomic class

    • SimulatedCAS.java : CAS 동작의 로직을 보여줌.
    • CasCounter.java : CAS 로직을 이용한 Counter
  • 설계 원칙

    • StackDemo.java : 쓰레드에 한정되어야할 객체를 콜스택 안에서 local변수로 생성하여 메소드 파라미터로 넘김.
    • ThreadLocalDemo.java : ThreadLocal을 이용.

7. Documentation

  • JCIP annotation
    • Memo.java : @Immutable로 선언했을 때 Findbugs를 경고를 보여줌
    • LoginInfo.java : Thread-safe하지 않은 클래스
    • UserService.java : Thread-safe하지 않은 클래스를 멤버변수로 사용하는 코드

8. 성능

  • 락좁히기
    • AttributeStore.java : 메소드 단위로 넓게 synchronized 구간을 선엄함.
    • BetterAttriebuteStore.java : AttributeStore.java에서 꼭 필요한 부분만 synchronized 구간을 잡음
  • 락분할
    • ServerStatusBeforeSplit.java : 메소드 단위로 넓게 synchronized 구간을 선엄함.
    • ServerStatusAfterSplit.java : 메소드별로 필요한 객체에만 synchronized를 걸어서 Lock을 분할.
  • 락스트라이핑
    • StripedMap.java : 락 스트라이핑을 적용한 Map
    • DefectedStripedMap.java : StripedMap에서 Hash방식을 바꿈
    • DefectedStripedMapTest.java : DefectedStripedMap의 오류를 드러내는 테스트
  • 바쁜 대기 없애기
    • SlowCountDownLatch.java : CountDownLatch를 무식하게 구현.
    • BaseBoundBuffer.java : 크기가 한정된 Buffer의 기본 구현.
    • GrumpyBoundBuffer.java : 바쁜 대기
    • SleepyBoundBuffer.java : Sleep을 이용해서 바쁜 대기를 약간 없앰
    • BoundedBuffer.java : wait, notify를 이용
    • ConditionBoundBuffer.java : Lock클래스를 이용
  • 늦은 초기화
    • Initialization.java : lazy initialization의 여러 방식을 보여줌
    • MySystem.java(Single) : 초기화 메서드 전체에 동기화가 걸림.
    • MySystem.java(Double Checked) : doublechecked lock을 적용
    • MySystem.java(Holder) : Holder패턴을 적용할려는 예정으로 있는 클래스
    • ColorPoint.java : final필드에 값이 할당되기 전에도 읽는 것이 가능하고, 늦은 초기화가 필요한 경우를 보여줌.

참고 자료

  • Effective Java 2nd Edition - Chaptor 10
  • Java concurrency in practice
  • Java로 배우는 디자인 패턴 입문 멀티쓰레드편
  • Thinking in java 4th edition - 17장 컨테이너 깊이 들어야보기, 21장 동시성
  • Agile java - Lesson 13 Multithreading
  • 프로그래밍 면접, 이렇게 준비한다. - Ch8 동시성