Skip to content

Latest commit

Β 

History

History
46 lines (37 loc) Β· 2.47 KB

Item_79._avoid_excessive_synchronization.md

File metadata and controls

46 lines (37 loc) Β· 2.47 KB

Item 79. κ³Όλ„ν•œ λ™κΈ°ν™”λŠ” 피해라

κ³Όλ„ν•œ 동기화

  • κ³Όλ„ν•œ λ™κΈ°ν™”λŠ” λ‹€μŒκ³Ό 같은 λ¬Έμ œμ μ„ μ•ΌκΈ°
    1. μ˜ˆμΈ‘ν•  수 μ—†λŠ” λ™μž‘ (μ˜λ„ν•˜μ§€ μ•Šμ€ μ˜ˆμ™Έλ₯Ό λ˜μ§€κ±°λ‚˜, κ΅μ°©μƒνƒœμ— 빠짐)
    2. μ„±λŠ₯ μ €ν•˜
  • λ”°λΌμ„œ, λ™κΈ°ν™”λŠ” λ°˜λ“œμ‹œ ν•„μš”ν•œ(μ—¬λŸ¬ μŠ€λ ˆλ“œμ—μ„œ κ°€λ³€ 데이터λ₯Ό μ œμ–΄ν•˜λŠ”) μƒν™©μ—μ„œλ§Œ μ‚¬μš©ν•΄μ•Ό ν•˜λ©°, 동기화 μ˜μ—­ μ•ˆμ—μ„œμ˜ μž‘μ—…λ„ μ΅œμ†Œν•œμœΌλ‘œ 쀄여야 함

μ˜ˆμΈ‘ν•  수 μ—†λŠ” λ™μž‘

public void addActivity(BiConsumer<List<String>, String> activity) {
    synchronized(list) {
        list.add(activity);
    }
}
  • μ‚¬μš©μžκ°€ μ •μ˜(κ΅¬ν˜„)ν•œ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό 인자둜 λ°›μ•„ λ¦¬μŠ€νŠΈμ— μΆ”κ°€ν•˜λŠ” λ©”μ„œλ“œ
  • μ‚¬μš©μžκ°€ listμ—μ„œ 자기 μžμ‹ μ„ μ œκ±°ν•˜λŠ” λ™μž‘μ„ μˆ˜ν–‰ν•œλ‹€λ©΄?
    • λŸ°νƒ€μž„μ— μ˜ˆμ™Έκ°€ λ°œμƒν•  수 있음
  • μ‚¬μš©μžκ°€ list의 μ œμ–΄κΆŒμ„ νšλ“ν•˜λ €λŠ” λ™μž‘μ„ μˆ˜ν–‰ν•œλ‹€λ©΄?
    • λŸ°νƒ€μž„μ— Deadlock(κ΅μ°©μƒνƒœ)이 λ°œμƒν•  수 있음
  • μ‚¬μš©μžκ°€ ν˜ΈμΆœν•œ λ™μž‘μ΄ λλ‚˜μ§€ μ•ŠλŠ”λ‹€λ©΄ - 동기화 μ˜μ—­ λ‚΄μ—μ„œ ν•˜λ‚˜μ˜ λ™μž‘μ΄ 였래 μˆ˜ν–‰λ˜λ©΄, κ·Έλ™μ•ˆ λ‹€λ₯Έ μŠ€λ ˆλ“œλŠ” 보호된 μžμ›μ„ μ‚¬μš©ν•˜μ§€ λͺ»ν•˜κ³  λŒ€κΈ°ν•΄μ•Ό 함 (μ„±λŠ₯ 맀우 μ €ν•˜)

μ„±λŠ₯ μ €ν•˜

  • 동기화 λΉ„μš© μžμ²΄κ°€ 큰 것은 μ•„λ‹˜
    • 지속적인 κ°œμ„ μœΌλ‘œ λ¬΄μ‹œ κ°€λŠ₯ν•  μˆ˜μ€€μ΄ λ˜μ—ˆμŒ
  • μ„±λŠ₯ μ €ν•˜ μš”μΈμ€ μ•„λž˜ 두 가지
    1. μŠ€λ ˆλ“œ κ°„ 경쟁
      • ν•œ μŠ€λ ˆλ“œκ°€ μžμ›μ„ μ„ μ ν•˜λŠ” λ™μ•ˆ λ‹€λ₯Έ μŠ€λ ˆλ“œλŠ” λŒ€κΈ°ν•΄μ•Ό 함
    2. κ°€μƒλ¨Έμ‹ μ˜ μ½”λ“œ μ΅œμ ν™”λ₯Ό μ œν•œ

κ°€λ³€ 클래슀λ₯Ό μž‘μ„±ν•˜λŠ” 방법

  1. 동기화λ₯Ό ν•˜μ§€ μ•Šκ³ , ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 동기화 μ±…μž„μ„ μœ„μž„
    • ex) java.util
  2. 동기화λ₯Ό λ‚΄λΆ€μ—μ„œ μˆ˜ν–‰ν•˜μ—¬ 제곡
    1. ex) java.util.concurrent
      • 동기화λ₯Ό 보μž₯ν•˜λŠ” κΈ°λŠ₯/자료ꡬ쑰 등을 μ œκ³΅ν•˜λŠ” 라이브러리
  • 2번의 경우 μ‚¬μš©μžκ°€ 단일 μŠ€λ ˆλ“œμ—μ„œ μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λ„ λΆˆν•„μš”ν•œ 동기화가 이루어지기 λ•Œλ¬Έμ—, 1λ²ˆμ„ ꢌμž₯
    • StringBuffer의 μ„±λŠ₯ 문제둜 λ’€λŠ¦κ²Œ StringBuilderκ°€ λ“±μž₯ν•œ μ΄μœ μ΄κΈ°λ„ 함
  • μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ ν˜ΈμΆœν•˜λŠ” λ©”μ„œλ“œ λ‚΄μ—μ„œ 정적 ν•„λ“œ 값을 μˆ˜μ •ν•œλ‹€λ©΄, 이 ν•„λ“œλ₯Ό μ‚¬μš©ν•˜κΈ° 전에 동기화해야 함
    • 이 정적 ν•„λ“œλŠ” μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— μ½κ±°λ‚˜ μˆ˜μ •ν•  수 μžˆλ‹€λŠ” μ μ—μ„œ 사싀상 μ „μ—­ λ³€μˆ˜μ™€ λ™μΌν•˜κΈ° λ•Œλ¬Έμ— 동기화가 이루어져야 함