java concurrency
EditConcurrency 개념
- http://minjang.egloos.com/2517211
- http://tutorials.jenkov.com/java-concurrency/index.html
- Double check idiom
- Java 멀티쓰레드 디자인패턴의 Appendix 1
- Effective java 2nd edition item 71
- http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
- http://findbugs.sourceforge.net/bugDescriptions.html#DC_DOUBLECHECK
- static initializer
- Java Concurrency: Executor와 Callable/FutureJava
- CommonJ의 Work Manager API 활용
- http://www.thinkingparallel.com/2007/07/31/10-ways-to-reduce-lock-contention-in-threaded-programs/
- HashMap의 무한루프 : http://mailinator.blogspot.com/2009/06/beautiful-race-condition.html
Volatile
voltile에 대한 Effective Java 1Ed 시절 설명
synchronized 키워드가 메소드와 블록에 쓰는 것이라면, volatile 키워드는 필드에 붙이는 수정자다. volatile 수정자 역시 스레드의 작업 메모리와 주 메모리의 내용을 일치시키는 역할을 한다. volatile 수정자가 붙은 필드는 항상 정확한 값을 제공한다는 것을 보장한다고 JLS는 명세하고 있다. synchronized가 원하는 객체의 잠금장치를 얻어 이 객체를 잠근 상태에서 원하는 필드에 접근한다면, volatile 수정자가 붙은 필드에 접근할 때 아무런 잠금장치를 쓰지 않아도 이 필드를 읽거나(use) 쓰면(assign) 언제나 작업메모리와 주 메모리의 내용을 일치시키는 작업이 일어난다고 한다. 하지만, 많은 JVM에서 volatile 필드가 제대로 동작하지 않을 수도 있으므로 조심해야 한다. JLS는 volatile 필드를 쓰는 코드부분을 바이트코드로 만들거나 실행할 때 최적화를 적용하지 말아야 한다고 명세하고 있지만 이것을 제대로 지키는 JVM은 거의 없다. 또, JLS은 다중 프로세서 환경에서 volatile 필드가 어떻게 동작하는지도 명확하게 명세하고 있지 않다. 현재까지 IBM JVM이 완벽하지는 않지만 volatile 명세를 가장 잘 지원하고 있따.(Sun이 아니다!). 만약 IBM JVM을 쓴다면, volatile 필드를 고려해 볼 수 있다. volatile을 쓰면 잠금이 일어나지 않아서 성능이 좋을 것 같지만, 상황에 따라 synchronized 키워드와 잘 가려 써야 한다. 필드에 접근하는 작업이 많다면 volatile 필드를 쓰는 것이 synchronized 메소드나 블록을 쓰는 것보다 성능이 떨어질 수 있으므로 synchronized 메소드나 블록을 쓰는 것이 더 낫다. 반대로, 뛰어난 동시성이 필요하고 플드에 접근하는 작업이 적다면 volatile 필드를 쓰는 것이 더 낫다. 하지만 한 번 만든 코드를 어디서나 쓸 수 있다는 자바의 기본 철학을 생각한다면 아직까지 volatile 필드를 쓰기에는 무리가 있다.
Thread Local
Virtual Thread
- Virtual Thread의 기본 개념
이해하기
- Java JNI 메서드의 호출 원리
- Vitual Thread가 Platform Thread에 mount, unmount하는 라이프싸이클 설명
- Virtual Thread pinning
- JDK 24이후로는 synchronized block에서 pinnng문제가 해결됨
- Virtual Thread 어디까지 보고
오셨어요?
- 플랫폼 스레드는 커널 모드 진입 및 CPU 캐시 재로딩 등 부가 비용이 크지만, 버추얼 스레드는 이를 피해 빠른 스케줄링·스위칭이 가능
- VitualThread는 Continuation과 실행할 Runnable을 가진 인스턴스
- Continuation을 활용해 함수의 실행 중단/재개(코루틴 유사)를 애플리케이션 힙에 스택 프레임을 저장·복원함으로써 구현
- park(), unpark()을 통해 실행 중단과 재계
- JDK는 Vitual Thread 효율성을 위해 소켓 주요 구현을 네이티브→자바 코드로 이동하거나 논블로킹 소켓 이용.
Mac
public static String getMessageDigest(Mac mac, String message) {
synchronized(mac) {
byte[] rawHmac = mac.doFinal(message.getBytes());
}
return Base64.encodeBase64(rawHmac);
}
race condition in java.util
- http://mailinator.blogspot.com/2009/06/beautiful-race-condition.html
- http://lightbody.net/blog/2005/07/hashmapget_can_cause_an_infini.html