Item 76. Failure Atomic

κ°€λŠ₯ν•œ ν•œ μ‹€νŒ¨ μ›μžμ μœΌλ‘œ λ§Œλ“€λΌ

μ‹€νŒ¨ μ›μžμ (failure-atomic)μ΄λž€ 호좜된 λ©”μ„œλ“œκ°€ μ‹€νŒ¨ν•˜λ”λΌλ„ ν•΄λ‹Ή κ°μ²΄λŠ” λ©”μ„œλ“œ 호좜 μ „ μƒνƒœλ₯Ό μœ μ§€ν•˜λŠ” 것을 λ§ν•œλ‹€. λ©”μ„œλ“œλ₯Ό μ‹€νŒ¨ μ›μžμ μœΌλ‘œ λ§Œλ“œλŠ” κ°€μž₯ κ°„λ‹¨ν•œ 방법은 λΆˆλ³€ 객체둜 μ„€κ³„ν•˜λŠ” 것이며, λΆˆλ³€ κ°μ²΄λŠ” μ‹€νŒ¨ μ›μžμ μ΄κΈ° λ•Œλ¬Έμ— 별닀λ₯Έ λ…Έλ ₯없이 μ‹€νŒ¨ μ›μžμ μœΌλ‘œ λ§Œλ“€ 수 μžˆλ‹€.

κ°€λ³€ 객체 λ©”μ„œλ“œμ˜ μ‹€νŒ¨ μ›μžμ„± 보μž₯ 방법

1. λ§€κ°œλ³€μˆ˜ μœ νš¨μ„± 검사

λ§Œμ•½ κ°€λ³€ 객체의 λ©”μ„œλ“œλ₯Ό μ‹€νŒ¨ μ›μžμ μœΌλ‘œ λ§Œλ“œλŠ” κ°€μž₯ 일반적인 방법은 μž‘μ—… μˆ˜ν–‰μ— μ•žμ„œ λ§€κ°œλ³€μˆ˜μ˜ μœ νš¨μ„±μ„ κ²€μ‚¬ν•˜μ—¬ μ˜ˆμ™Έμ˜ κ°€λŠ₯성을 μ€„μ΄λŠ” 것이닀.


public Object pop() {
    if (size == 0) {
        throw new EmptyStackException();
    }
    Object result = elements[--size];
    elements[size] = null;
    return result;
}

size == 0 검사 μ˜ˆμ™Έλ₯Ό λ˜μ§€μ§€ μ•Šλ”λΌλ„ elements[--size]μ—μ„œ ArrayIndexOutOfBoundsException μ˜ˆμ™Έκ°€ λ°œμƒν•˜κ²Œ λœλ‹€. ν•˜μ§€λ§Œ ν•΄λ‹Ή λΌμΈκΉŒμ§€ κ°€κ²Œ 되면 size 값이 이미 κ°μ†Œλ˜κΈ° λ•Œλ¬Έμ— 객체의 μƒνƒœκ°€ λ³€κ²½λ˜μ–΄ μ‹€νŒ¨ μ›μžμ μ΄μ§€ μ•Šκ²Œ λœλ‹€.

2. μ‹€νŒ¨ν•  κ°€λŠ₯성이 μžˆλŠ” λͺ¨λ“  μ½”λ“œλ₯Ό, 객체의 μƒνƒœλ₯Ό λ°”κΎΈλŠ” μ½”λ“œλ³΄λ‹€ μ•žμ— 배치

μ‹€μ œ 연산을 μˆ˜ν–‰ν•˜κΈ° 전에 인수의 μœ νš¨μ„± 검사 ν•  수 없을 λ•Œ μ‚¬μš©ν•˜λŠ” λ°©λ²•μœΌλ‘œ, TreeMap은 μ–΄λ–€ κΈ°μ€€μœΌλ‘œ μ •λ ¬ν•˜κ²Œ λ˜λŠ”λ°, λ‹€λ₯Έ νƒ€μž…μ˜ μ›μ†Œλ₯Ό μΆ”κ°€ν•˜λ € ν•˜λ©΄ ClassCastException μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€κ²Œ λœλ‹€.

3. μž„μ‹œ 볡사본 μ‚¬μš©

μž„μ‹œ 볡사본을 λ§Œλ“€μ–΄ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ³ , μž‘μ—…μ΄ μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œλ˜λ©΄ μ›λž˜ 객체와 κ΅μ²΄ν•˜λŠ” 방법이닀. μž„μ‹œ μ €μž₯μ†Œμ— μ €μž₯ν•˜μ—¬ μž‘μ—…ν•˜λŠ” 게 λΉ λ₯Ό λ•Œ μ μš©ν•˜κΈ° μ’‹μœΌλ©°, μž‘μ—…μ΄ μ‹€νŒ¨ν•˜λ”λΌλ„ μ›λž˜ κ°μ²΄λŠ” λ³€ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ‹€νŒ¨ μ›μžμ μœΌλ‘œ λ§Œλ“€ 수 μžˆλ‹€.

4. 볡ꡬ μ½”λ“œ μž‘μ„±

μž‘μ—… 도쀑 λ°œμƒν•˜λŠ” μ‹€νŒ¨λ₯Ό κ°€λ‘œμ±„λŠ” 볡ꡬ μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ—¬ μž‘μ—… μ „ μƒνƒœλ‘œ λ˜λŒλ¦¬λŠ” 방법이닀. 주둜 내ꡬ성(durability)을 보μž₯ν•΄μ•Ό ν•˜λŠ” μžλ£Œκ΅¬μ‘°μ— μ μš©ν•˜κΈ° μ’‹μœΌλ©°, 볡ꡬ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 것이 μ–΄λ ΅κ³ , 자주 μ“°μ΄λŠ” 방법은 μ•„λ‹ˆλ‹€.

μ‹€νŒ¨ μ›μžμ„±μ„ λ‹¬μ„±ν•˜κΈ° μ–΄λ €μš΄ 경우

μ‹€νŒ¨ μ›μžμ„±μ€ 일반적으둜 ꢌμž₯λ˜μ§€λ§Œ, 항상 μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” 것은 μ•„λ‹ˆλ©° μ•„λž˜μ™€ 같은 κ²½μš°μ—λŠ” λ‹¬μ„±ν•˜κΈ° μ–΄λ ΅κ±°λ‚˜ ν•˜μ§€ μ•ŠλŠ” 것이 쒋을 수 μžˆλ‹€.

  • 두 μŠ€λ ˆλ“œκ°€ 동기화 없이 같은 객체λ₯Ό λ™μ‹œμ— μˆ˜μ •ν•  λ•Œ

  • μ‹€νŒ¨ μ›μžμ„±μ„ λ‹¬μ„±ν•˜κΈ° μœ„ν•œ λΉ„μš©μ΄λ‚˜ λ³΅μž‘λ„κ°€ λ„ˆλ¬΄ 큰 경우

μ‹€νŒ¨ μ›μžμ„±μ€ 항상 μ§€μΌœμ•Ό ν•˜λŠ” 것은 μ•„λ‹ˆμ§€λ§Œ λ§Œμ•½ 지킀지 λͺ» ν–ˆμ„ κ²½μš°μ—” API μ„€λͺ…에 λͺ…μ‹œν•΄μ•Ό ν•œλ‹€.

Last updated

Was this helpful?