Open HaeUlNam opened 1 year ago
CountDownLatch
많이 보이는데 이번에 그 까닭을 알게됨Spliterator
가 Split + Iterator인 것 같은데, 이름을 잘지은 것 같기도하고 아닌 것 같기도하고..ㅋㅋsynchronized
키워드로 감싸지 않은 액세스에 대해서는 데이터 일치를 전혀 보장하지 않음synchronized
키워드의 한계
java.util.concurrent
패키지로 멀티스레드 애플리케이션 개발을 쉽게해줌
sun.misc.Unsafe
) JDK 9부터는 jdk.unsupported
패키지로 이동함countdown()
이 호출될 때까지 await()
메소드로 스레드를 블로킹시킬 수 있음ForkJoinTask
로 자기 자신을 더 작은 서브태스크로 분할 시킬 수 있음parallelStream()
은 포크/조인을 사용하기 때문에 활용 범위가 크게 확대됨parallelStream()
으로 병렬로 데이터를 작업 후 결과를 재조합 할 수 있음
Spliterator
를 써서 작업을 분할함Java Concurrency in Practice 바로 주문했음
volatile
: 변수 값을CPU Cache
가 아닌Main Memory
를 참조하여 조회/수정 하도록 해줌
CPU core마다 CPU Cache를 갖고 있는데, Multi core 머신에서 Java의 Multi Thread는 여러 core에 스케줄링될 수 있고, 그러다보니 데이터 불일치가 발생할 확률이 있음
이런 가능성을 줄여주고자 CPU Cache가 아닌 Main Memory를 참조하도록 함
CPU Cache
가서버 애플리케이션단의 Local Cache
라면,Main Memory
는Global Cache
같은 느낌이랄까...그런데 증분 연산자가 'atomic'하지 않아,
volatile
을 쓴다고 해도 동시성을 완전히 해결할 순 없다서버 애플리케이션단에서 해결하려면
Global Lock
을 사용함 ex)Redis + Redisson
orOptimistic Lock
orPessimistic Lock
synchronized
또는Lock
을 서버 애플리케이션의 Global Lock처럼 보면 될 듯
테스트는 버그가 있다는 사실을 밝히지만, 버그가 없다는 사실을 밝히지는 않는다 - 데이크스트라
명언이다 ㄷㄷ
p.386.
가장 흔히 사용하는 지표가 코어 수 대비 풀 스레드 수입니다
Netty의 경우 기본적으로
availableProcessors() * 2
ForkJoinPool은
availableProcessors() - 1
경합 중인 리소스가 극히 짧은 시간동안만 사용할 경우 이런 방식은 막대한 오버헤드를 유발할 수 있습니다. 블로킹된 스레드를 CPU에 활성 상태로 놔두고 아무 일도 시키지 않은 채 락을 손에 넣을 때까지 'CPU를 태워가며' 계속 재시도하게 만드는 편이 더 효율적이겠죠
Thread Busy 가 Context Switching보다 더 효율적인건가? (극히 짧은 시간인 경우에 한해서일 듯)
park은 Thread 양보하는 거고, block은 잡고있는건가? sleep은 block 하위개념일 것 같기도?
알아보려했는데 아직 못 알아봄
자바 스레드는 OS 수준의 프로세스와 동등하며
-> OS Thread와 JVM Thread가 1:1 매핑되어서? (Platform Thread)newSingleThreadExecutor() == newFixedThreadPool(1)
인건가?
코드 보니까 똑같은데 thread 수만 다름 (
nThread -> 1
)public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue
정리
질문