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

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

  • μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ 쀑이면 운영체제의 μŠ€λ ˆλ“œ μŠ€μΌ€μ€„λŸ¬κ°€ μ–΄λ–€ μŠ€λ ˆλ“œλ₯Ό μ–Ό λ§ˆλ‚˜ 였래 싀행할지 μ •ν•œλ‹€. 정상적인 운영체제라면 이 μž‘μ—…μ„ κ³΅μ •ν•˜κ²Œ μˆ˜ν–‰ ν•˜μ§€λ§Œ ꡬ체적인 μŠ€μΌ€μ€„λ§ 정책은 μš΄μ˜μ²΄μ œλ§ˆλ‹€ λ‹€λ₯Ό 수 μžˆλ‹€.
    μ •ν™•μ„±μ΄λ‚˜ μ„±λŠ₯이 슀 λ ˆλ“œ μŠ€μΌ€μ€„λŸ¬μ— 따라 λ‹¬λΌμ§€λŠ” ν”„λ‘œκ·Έλž¨μ΄λΌλ©΄ λ‹€λ₯Έ ν”Œλž«νΌμ— μ΄μ‹ν•˜κΈ° μ–΄λ ΅λ‹€.

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

  • μ‹€ν–‰ κ°€λŠ₯ν•œ μŠ€λ ˆλ“œμ˜ 평균적인 수λ₯Ό ν”„λ‘œμ„Έμ„œ μˆ˜λ³΄λ‹€ μ§€λ‚˜μΉ˜κ²Œ λ§Žμ•„μ§€μ§€ μ•Šλ„ 둝 ν•˜λŠ” 것이닀.
    μ‹€ν–‰ μ€€ λΉ„κ°€ 된 μŠ€λ ˆλ“œλ“€μ€ 맑은 μž‘μ—…μ„ μ™„λ£Œν•  λ•ŒκΉŒμ§€ 계속 μ‹€ν–‰λ˜λ„λ‘ λ§Œλ“€μž.

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

  • 각 μŠ€λ ˆλ“œκ°€ 무언가 유 μš©ν•œ μž‘μ—…μ„ μ™„λ£Œν•œ ν›„μ—λŠ” λ‹€μŒ 일거리가 생길 λ•ŒκΉŒμ§€ λŒ€κΈ°ν•˜λ„λ‘ ν•˜λŠ” 것 이닀. μŠ€λ ˆλ“œλŠ” λ‹Ήμž₯ μ²˜λ¦¬ν•΄μ•Ό ν•  μž‘μ—…μ΄ μ—†λ‹€λ©΄ μ‹€ν–‰λΌμ„œλŠ” μ•ˆ λœλ‹€.
  • μŠ€λ ˆλ“œ ν’€ 크기λ₯Ό 적절히 μ„€μ •ν•˜κ³  μž‘μ—…μ€ 짧게 μœ μ§€ν•˜λ©΄ λœλ‹€. 단, λ„ˆλ¬΄ 짧으면 μž‘μ—…μ„ λΆ„λ°°ν•˜λŠ” 뢀담이 였히렀 μ„±λŠ₯을 λ–¨μ–΄λœ¨λ¦΄ μˆ˜λ„ μžˆλ‹€.

μŠ€λ ˆλ“œλŠ” μ ˆλŒ€ λ°”μœ λŒ€κΈ°(busy waiting) μƒνƒœκ°€ 되면 μ•ˆ λœλ‹€

public class SlowCountDownLatch {
    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--; 
    }
}
  • 곡유 객체 의 μƒνƒœκ°€ λ°”λ€” λ•ŒκΉŒμ§€ 쉬지 μ•Šκ³  κ²€μ‚¬ν•΄μ„œλŠ” μ•ˆ λœλ‹€λŠ” λœ»μ΄λ‹€.
  • λ°”μœ λŒ€κΈ°λŠ” μŠ€λ ˆλ“œ μŠ€μΌ€μ€„λŸ¬μ˜ 변덕에 μ·¨μ•½ν•  뿐 μ•„λ‹ˆλΌ, ν”„λ‘œμ„Έμ„œμ— 큰 뢀담을 μ£Όμ–΄ λ‹€λ₯Έ μœ μš©ν•œ μž‘μ—…μ΄ 싀행될 기회λ₯Ό λ°•νƒˆν•œλ‹€.
  • 이 μ˜ˆκ°€ μ’€ μ–΅μ§€μŠ€λŸ¬μ›Œ 보일지 λͺ¨λ₯΄μ§€ 만, ν•˜λ‚˜ μ΄μƒμ˜ μŠ€λ ˆλ“œκ°€ ν•„μš”λ„ 없이 μ‹€ν–‰ κ°€λŠ₯ν•œ μƒνƒœμΈ μ‹œμŠ€ν…œμ€ ν”ν•˜κ²Œ λ³Ό 수 μžˆλ‹€. 이런 μ‹œμŠ€ν…œμ€ μ„±λŠ₯κ³Ό 이식성이 λ–¨μ–΄μ§ˆ 수 μžˆλ‹€.