- Effective Java 2nd edition
- package: ej2
- 원본 : http://java.sun.com/docs/books/effective/effective2.zip
- Java concurrency in practice
- package : net.jcip
- 원본 : http://jcip.net/listings.html, http://jcip.net/jcip-examples-src.jar
- Java 언어로 배우는 디자인 패턴 입문 멀티 쓰레드 편
- package : jdm
- 원본 : http://ndisk.youngjin.com/bookcd/pds_view.asp?pcd=9788931436921
- 유쾌한 자바 퍼즐러
- 원본 : http://www.javapuzzlers.com/java-puzzlers.zip
- package : jpz
- Concurrent Programming Distributed Applications 발표
- SpringOne 2GX 2010에서 David Syer와 Mark Fisher가 한 발표
- 원본 : http://git.springsource.org/s2gx-2010/concurrent-programming-distributed-applications/trees/master/concurrency
- package : s2gx
- Think in java 4th Edition
- 나머지는 직접 작성한 예제
- 쓰지 말아야할 것: Thread.stop
- PrimeGenerator.java : 협력적으로 Thread를 멈추는 방식
- 잘 알고 쓸 것 : Thread.interrupt
- SelfInterruption.java : Thread.interrupted()의 혼란성을 보여줌
- BrokenPrimeProducer.java : BlockingQueue가 blocking되어 있으면 중지되지 않는 쓰레드
- PrimeProducer.java : interrupt로 중지할 수 있는 쓰레드
- 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이 호출되면 예상치 못한 동작이 발생함을 보여줌
- 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를 이용한 클래스
-
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을 이용.
- JCIP annotation
- Memo.java : @Immutable로 선언했을 때 Findbugs를 경고를 보여줌
- LoginInfo.java : Thread-safe하지 않은 클래스
- UserService.java : Thread-safe하지 않은 클래스를 멤버변수로 사용하는 코드
- 락좁히기
- 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필드에 값이 할당되기 전에도 읽는 것이 가능하고, 늦은 초기화가 필요한 경우를 보여줌.