item 84 hyowon - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

ν”„λ‘œκ·Έλž¨μ˜ λ™μž‘μ„ μŠ€λ ˆλ“œ μŠ€μΌ€μ€„λŸ¬μ— κΈ°λŒ€μ§€ 말라

(μ°Έκ³ ) Javaμ—μ„œ λ‹€μ€‘μž‘μ—…μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ 방법듀

  1. Executor Framework
  2. μΉ΄μš΄νŠΈλ‹€μš΄λž˜μΉ˜(CountDownLatch) & 사이클릭배리어(CyclicBarrier)
  3. ForkJoin ν”„λ ˆμž„μ›

μž‘μ—…μ΄ λΆ„λ¦¬λ˜μ§€ μ•ŠλŠ” 경우 : β€œExecutor”
– κ°€μž₯ 많이 μ‚¬μš©ν•˜λŠ” ν˜•νƒœ

μž‘μ—…μ΄ λΆ„λ¦¬λ˜λŠ” 경우 : β€œμΉ΄μš΄νŠΈλ‹€μš΄λž˜μΉ˜β€ or β€œν¬ν¬μ‘°μΈβ€
– λ§Žμ€ μ–‘μ˜ 데이터 μ •λ ¬, μ΅œλŒ€, μ΅œμ†Œκ°’ μ°ΎλŠ” 경우, λ§Žμ€ μ–‘μ˜ 데이터λ₯Ό ν•©μ‚°ν•˜λŠ” 경우, λ„€νŠΈμ›μ„ μŠ€μΊ”ν•˜λŠ” 경우 λ“±

μž‘μ—…μ΄ 뢄리될 μˆ˜λ„ 있고 아닐 μˆ˜λ„ μžˆλŠ” 단계가 μžˆλŠ” μž‘μ—… : β€œμ‚¬μ΄ν΄λ¦­λ°°λ¦¬μ–΄β€

JVMλ§ˆλ‹€ λ‹€λ₯Έ μŠ€λ ˆλ“œ μŠ€μΌ€μ₯΄λ§ μ •μ±…

μŠ€λ ˆλ“œ μŠ€μΌ€μ₯΄λ§ 정책은 μš΄μ˜μ²΄μ œλ§ˆλ‹€ λ‹€λ₯Ό 수 μžˆμ–΄ μ–΄λ–€ JVMμ—μ„œλŠ” 속도가 더 빨라질 μˆ˜λ„, μ–΄λ–€ JVMμ—μ„œλŠ” νš¨κ³Όκ°€ 없을 μˆ˜λ„, μ–΄λ–€ JVMμ—μ„œλŠ” 더 느렀질 μˆ˜λ„ μžˆλ‹€.

κ·ΈλŸ¬λ‹ˆ νŠΉμ • μŠ€λ ˆλ“œκ°€ λ‹€λ₯Έ μŠ€λ ˆλ“œλ“€κ³Ό 비ꡐ해 CPU μ‹œκ°„μ„ μΆ©λΆ„νžˆ 얻지 λͺ»ν•΄ κ°„μ‹ νžˆ λŒμ•„κ°€λŠ” ν”„λ‘œκ·Έλž¨μ„ 보더라도 Thread.yield() (λ‹€λ₯Έ μŠ€λ ˆλ“œμ—κ²Œ μ‹€ν–‰μƒνƒœλ₯Ό μ–‘λ³΄ν•˜κ³  μžμ‹ μ€ μ€€λΉ„μƒνƒœκ°€ λœλ‹€.)λ₯Ό μ‚¬μš©ν•΄ 문제λ₯Ό κ³ μ³λ³΄λ €λŠ” μœ ν˜Ήμ„ λ–¨μ³λ‚΄μž.

결둠적으둜, μ •ν™•μ„±μ΄λ‚˜ μ„±λŠ₯이 μŠ€λ ˆλ“œ μŠ€μΌ€μ₯΄λŸ¬μ˜ 역할에 달린 ν”„λ‘œκ·Έλž¨μ΄λΌλ©΄ λ‹€λ₯Έ ν”Œλž«νΌμ— μ΄μ‹ν•˜κΈ° μ–΄λ ΅λ‹€.

κ²¬κ³ ν•˜κ³  λΉ λ¦Ών•˜κ³  이식성 쒋은 ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λŠ” κ°€μž₯ 쒋은 방법

  • μ‹€ν–‰ κ°€λŠ₯ν•œ μŠ€λ ˆλ“œμ˜ 평균적인 수λ₯Ό ν”„λ‘œμ„Έμ„œ μˆ˜λ³΄λ‹€ μ§€λ‚˜μΉ˜κ²Œ λ§Žμ•„μ§€μ§€ μ•Šλ„λ‘ ν•œλ‹€.
  • μ‹€ν–‰ μ€€λΉ„κ°€ 된 μŠ€λ ˆλ“œλ“€μ€ 맑은 μž‘μ—…μ„ μ™„λ£Œν•  λ•ŒκΉŒμ§€ 계속 μ‹€ν–‰λ˜λ„λ‘ λ§Œλ“€μž. (κ·Έλž˜μ•Ό μŠ€λ ˆλ“œ μŠ€μΌ€μ€„λŸ¬κ°€ κ³ λ―Όν•  거리가 쀄어든닀.)

μ—¬κΈ°μ„œ μ‹€ν–‰ κ°€λŠ₯ν•œ μŠ€λ ˆλ“œμ˜ μˆ˜μ™€ 전체 μŠ€λ ˆλ“œ 수λ₯Ό κ΅¬λΆ„ν•˜μžλ©΄

전체 μŠ€λ ˆλ“œ 수 β‰₯ μ‹€ν–‰ κ°€λŠ₯ν•œ μŠ€λ ˆλ“œ 수

μ‹€ν–‰ κ°€λŠ₯ν•œ μŠ€λ ˆλ“œ β‰  λŒ€κΈ° 쀑인 μŠ€λ ˆλ“œ

μ‹€ν–‰ κ°€λŠ₯ν•œ μŠ€λ ˆλ“œ 수λ₯Ό 적게 μœ μ§€ν•˜λŠ” 기법

  • 각 μŠ€λ ˆλ“œκ°€ μž‘μ—…μ„ μ™„λ£Œν•œ ν›„μ—λŠ” λ‹€μŒ 일거리가 생길 λ•ŒκΉŒμ§€ λŒ€κΈ°ν•˜λ„λ‘ ν•œλ‹€.
  • μŠ€λ ˆλ“œλŠ” λ‹Ήμž₯ μ²˜λ¦¬ν•΄μ•Ό ν•  μž‘μ—…μ΄ μ—†λ‹€λ©΄ μ‹€ν–‰λΌμ„œλŠ” μ•ˆ λœλ‹€. μ‹€ν–‰μž(Executor) ν”„λ ˆμž„μ›Œν¬λ₯Ό 예둜 λ“€λ©΄, μŠ€λ ˆλ“œ ν’€ 크기λ₯Ό 적절히 μ„€μ •ν•˜κ³  μž‘μ—…μ€ 짧게 μœ μ§€ν•œλ‹€. 단, λ„ˆλ¬΄ 짧으면 μž‘μ—…μ„ λΆ„λ°°ν•˜λŠ” 뢀담이 였히렀 μ„±λŠ₯을 λ–¨μ–΄λœ¨λ¦΄ μˆ˜λ„ μžˆλ‹€.
  • μŠ€λ ˆλ“œλŠ” μ ˆλŒ€ λ°”μœ λŒ€κΈ°(busy waiting) μƒνƒœκ°€ λ˜μ–΄μ„  μ•ˆλœλ‹€.
  • CountDownLatchλž€? (https://dev.re.kr/52)
public class SlowCountDownLatch extends Thread {
    private int count;

    public SlowCountDownLatch(int count) {
        if (count < 0)
            throw new IllegalArgumentException(count + "< 0 ");
        this.count = count;
    }

    public void await() {
	// !!!!!!!!!!!!!!!!!!!!!!!!!
        while (true) {
            synchronized (this) {
                if (count == 0)
                    return;
            }
        }
	// !!!!!!!!!!!!!!!!!!!!!!!!!
    }

    public synchronized void countDown() {
        if (count != 0)
            count--;
    }
}