Skip to content

Latest commit

Β 

History

History
38 lines (26 loc) Β· 5.16 KB

File metadata and controls

38 lines (26 loc) Β· 5.16 KB

μŠ€λ ˆλ“œ μ•ˆμ „μ„±

1. μŠ€λ ˆλ“œμ™€ 동기화

  • μŠ€λ ˆλ“œλŠ” λ™μ‹œμ— μ—¬λŸ¬ μž‘μ—…μ„ λ³‘λ ¬λ‘œ μ²˜λ¦¬ν•  수 있게 ν•΄μ£ΌλŠ” ν”„λ‘œκ·Έλž˜λ° κΈ°λ²•μž…λ‹ˆλ‹€. μžλ°”μ—μ„œλŠ” λ©€ν‹°μŠ€λ ˆλ”©μ„ 톡해 μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ ν•˜λ‚˜μ˜ κ°μ²΄λ‚˜ 데이터λ₯Ό λ™μ‹œμ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • **동기화(synchronization)**λŠ” μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ 같은 데이터에 μ ‘κ·Όν•  λ•Œ 데이터가 μ†μƒλ˜κ±°λ‚˜ 잘λͺ»λœ 값이 μ½νžˆμ§€ μ•Šλ„λ‘ λ³΄ν˜Έν•˜λŠ” λ©”μ»€λ‹ˆμ¦˜μž…λ‹ˆλ‹€. 동기화 없이 μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— ν•˜λ‚˜μ˜ 객체λ₯Ό μˆ˜μ •ν•˜λ©΄ 경쟁 쑰건(Race Condition) 같은 λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2. λ©”λͺ¨λ¦¬ λͺ¨λΈ

  • μžλ°”λŠ” λ©”λͺ¨λ¦¬ λͺ¨λΈμ„ 톡해 μŠ€λ ˆλ“œ κ°„μ˜ 데이터 κ°€μ‹œμ„±μ„ μ •μ˜ν•©λ‹ˆλ‹€. 즉, ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œμ—μ„œ λ§Œλ“  객체λ₯Ό λ‹€λ₯Έ μŠ€λ ˆλ“œλ‘œ λ„˜κΈΈ λ•Œ, κ·Έ 객체가 μ–΄λ–»κ²Œ λ‹€λ₯Έ μŠ€λ ˆλ“œμ—μ„œ λ³Ό 수 μžˆλŠ”μ§€μ™€ λ™μž‘ν•  수 μžˆλŠ”μ§€λ₯Ό μ„€λͺ…ν•˜λŠ” 것이 λ©”λͺ¨λ¦¬ λͺ¨λΈμž…λ‹ˆλ‹€.
  • μžλ°” λ©”λͺ¨λ¦¬ λͺ¨λΈμ€ 각 μŠ€λ ˆλ“œκ°€ λ©”λͺ¨λ¦¬μ™€ μ–΄λ–»κ²Œ μƒν˜Έμž‘μš©ν•˜λŠ”μ§€, 데이터가 **μ£Ό λ©”λͺ¨λ¦¬(Main Memory)**에 μ–΄λ–»κ²Œ 쓰이고 μ½νžˆλŠ”μ§€λ₯Ό μ„€λͺ…ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, ν•œ μŠ€λ ˆλ“œκ°€ 객체λ₯Ό λ§Œλ“€κ³  값을 μ΄ˆκΈ°ν™”ν•œ ν›„, κ·Έ 객체λ₯Ό λ‹€λ₯Έ μŠ€λ ˆλ“œλ‘œ λ„˜κΈΈ λ•Œ λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ ν•΄λ‹Ή 값을 μ œλŒ€λ‘œ 읽을 수 μžˆλŠ”μ§€μ˜ λ¬Έμ œκ°€ 여기에 ν•΄λ‹Ήν•©λ‹ˆλ‹€.

문제점: 동기화 없이 μΈμŠ€ν„΄μŠ€λ₯Ό λ‹€λ₯Έ μŠ€λ ˆλ“œλ‘œ λ„˜κΈΈ λ•Œ

λ§Œμ•½ 동기화 없이 ν•œ μŠ€λ ˆλ“œμ—μ„œ λ§Œλ“  객체λ₯Ό λ‹€λ₯Έ μŠ€λ ˆλ“œλ‘œ λ„˜κΈ°λ©΄, λ‹€μŒκ³Ό 같은 λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€:

  1. κ°€μ‹œμ„± 문제(Visibility Issue):
    μŠ€λ ˆλ“œ Aμ—μ„œ 객체λ₯Ό μƒμ„±ν•˜κ³  ν•„λ“œλ₯Ό μ΄ˆκΈ°ν™”ν•œ ν›„, κ·Έ 객체λ₯Ό μŠ€λ ˆλ“œ B둜 λ„˜κΈΈ λ•Œ, μŠ€λ ˆλ“œ BλŠ” μŠ€λ ˆλ“œ Aμ—μ„œ λ³€κ²½ν•œ 값을 λ³Ό 수 없을 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” μžλ°” λ©”λͺ¨λ¦¬ λͺ¨λΈμ—μ„œ λ³€κ²½λœ 값이 μ£Ό λ©”λͺ¨λ¦¬μ— λ°”λ‘œ κΈ°λ‘λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ°œμƒν•©λ‹ˆλ‹€. λ”°λΌμ„œ μŠ€λ ˆλ“œ BλŠ” μŠ€λ ˆλ“œ Aκ°€ λ§Œλ“  객체의 초기 μƒνƒœλ‚˜ μ˜ˆμƒμΉ˜ λͺ»ν•œ 값을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
  2. λͺ…λ Ήμ–΄ μž¬λ°°μ—΄(Reordering):
    μžλ°” μ»΄νŒŒμΌλŸ¬μ™€ CPUλŠ” μ΅œμ ν™”λ₯Ό μœ„ν•΄ λͺ…λ Ήμ–΄ μž¬λ°°μ—΄μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 즉, 객체λ₯Ό μƒμ„±ν•˜κ³  μ΄ˆκΈ°ν™”ν•˜λŠ” μˆœμ„œκ°€ μŠ€λ ˆλ“œ Aμ—μ„œ μŠ€λ ˆλ“œ B둜 λ„˜μ–΄κ°€λŠ” κ³Όμ •μ—μ„œ 변경될 수 μžˆμ–΄, 객체가 μ™„μ „νžˆ μ΄ˆκΈ°ν™”λ˜κΈ° 전에 λ‹€λ₯Έ μŠ€λ ˆλ“œμ—μ„œ κ·Έ 객체에 μ ‘κ·Όν•  μœ„ν—˜μ΄ μžˆμŠ΅λ‹ˆλ‹€. 이런 경우, μŠ€λ ˆλ“œ BλŠ” μ™„μ „νžˆ μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ 객체λ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

ν•΄κ²° 방법: μ•ˆμ „ν•œ 객체 전달을 μœ„ν•œ 방법

μžλ°”μ—μ„œλŠ” 동기화 없이도 μ•ˆμ „ν•˜κ²Œ 객체λ₯Ό λ‹€λ₯Έ μŠ€λ ˆλ“œλ‘œ λ„˜κΈ°λŠ” 방법이 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒ 방법듀이 자주 μ‚¬μš©λ©λ‹ˆλ‹€:

  1. λΆˆλ³€ 객체(Immutable Object):
    λΆˆλ³€ κ°μ²΄λŠ” ν•œ 번 μƒμ„±λ˜λ©΄ μ ˆλŒ€ μƒνƒœκ°€ λ³€κ²½λ˜μ§€ μ•ŠλŠ” κ°μ²΄μž…λ‹ˆλ‹€. λΆˆλ³€ κ°μ²΄λŠ” 생성 κ³Όμ • 쀑에 λ‹€λ₯Έ μŠ€λ ˆλ“œμ— λ…ΈμΆœλ˜λ”λΌλ„ μ•ˆμ „ν•©λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ 객체의 μƒνƒœκ°€ λ³€κ²½λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ κ·Έ 객체λ₯Ό 읽더라도 μ•ˆμ „ν•˜κ²Œ μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. μžλ°”μ˜ Stringμ΄λ‚˜ Integer 같은 ν΄λž˜μŠ€κ°€ κ·Έ μ˜ˆμž…λ‹ˆλ‹€.
  2. final ν•„λ“œ:
    μžλ°”μ—μ„œ final ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ ν•„λ“œλŠ” μƒμ„±μžκ°€ μ™„λ£Œλœ 이후에 값이 λ³€κ²½λ˜μ§€ μ•Šλ„λ‘ 보μž₯ν•©λ‹ˆλ‹€. final ν•„λ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” μŠ€λ ˆλ“œ 간에 μ•ˆμ „ν•˜κ²Œ 곡유될 수 μžˆμŠ΅λ‹ˆλ‹€. 즉, 객체가 λ‹€λ₯Έ μŠ€λ ˆλ“œμ— λ„˜κ²¨μ‘Œμ„ λ•Œ, final ν•„λ“œ 값은 μ–Έμ œλ‚˜ μ •ν™•ν•œ κ°’μœΌλ‘œ λ³Ό 수 μžˆλ„λ‘ 보μž₯λ©λ‹ˆλ‹€.
  3. volatile ν‚€μ›Œλ“œ:
    μžλ°”μ—μ„œλŠ” volatile ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ λ³€μˆ˜λ₯Ό μ½κ±°λ‚˜ μ“Έ λ•Œ 항상 μ£Ό λ©”λͺ¨λ¦¬μ™€ λ™κΈ°ν™”λ˜λ„λ‘ κ°•μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€. volatile λ³€μˆ˜λŠ” μ—¬λŸ¬ μŠ€λ ˆλ“œ 간에 λ™μΌν•œ 값을 항상 λ³Ό 수 μžˆλ„λ‘ 보μž₯ν•˜κΈ° λ•Œλ¬Έμ—, 동기화 없이 객체λ₯Ό μ•ˆμ „ν•˜κ²Œ κ³΅μœ ν•  수 있게 λ„μ™€μ€λ‹ˆλ‹€.
  4. μŠ€λ ˆλ“œ μ»¨ν…μŠ€νŠΈ μ „ν™˜ ν›„ 전달:
    객체λ₯Ό μŠ€λ ˆλ“œ 간에 λ„˜κΈ°κΈ° 전에 κ·Έ 객체가 μ™„μ „νžˆ μƒμ„±λ˜κ³  μ΄ˆκΈ°ν™”λ˜μ—ˆμŒμ„ 보μž₯ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 객체가 μƒμ„±λœ ν›„ μŠ€λ ˆλ“œλ₯Ό μ‹œμž‘ν•˜κ±°λ‚˜, 객체λ₯Ό λ„˜κΈ°κΈ° 전에 락을 μ‚¬μš©ν•˜μ—¬ λ™κΈ°ν™”ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ•ˆμ „ν•˜κ²Œ λ„˜κΈΈ 수 μžˆμŠ΅λ‹ˆλ‹€.

μš”μ•½

  • μžλ°”μ˜ λ©”λͺ¨λ¦¬ λͺ¨λΈμ— λ”°λ₯΄λ©΄, μŠ€λ ˆλ“œ 간에 객체λ₯Ό μ•ˆμ „ν•˜κ²Œ κ³΅μœ ν•˜κΈ° μœ„ν•΄μ„œλŠ” 동기화가 ν•„μš”ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ λΆˆλ³€ κ°μ²΄λ‚˜ final ν•„λ“œ λ˜λŠ” volatile ν‚€μ›Œλ“œ 같은 κΈ°μˆ μ„ μ‚¬μš©ν•˜λ©΄ 동기화 없이도 μ•ˆμ „ν•˜κ²Œ 객체λ₯Ό λ‹€λ₯Έ μŠ€λ ˆλ“œλ‘œ λ„˜κΈΈ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ΄λŸ¬ν•œ κ°œλ…μ€ λ©€ν‹°μŠ€λ ˆλ”© ν™˜κ²½μ—μ„œ 데이터 κ°€μ‹œμ„±κ³Ό 일관성을 보μž₯ν•˜λŠ” 데 맀우 μ€‘μš”ν•©λ‹ˆλ‹€. 특히 객체가 μ™„μ „νžˆ μ΄ˆκΈ°ν™”λœ ν›„ λ‹€λ₯Έ μŠ€λ ˆλ“œλ‘œ λ„˜κΈ°λŠ” 것이 μ€‘μš”ν•˜λ©°, 이λ₯Ό 보μž₯ν•˜μ§€ μ•ŠμœΌλ©΄ μŠ€λ ˆλ“œ κ°„μ˜ 데이터 μ†μƒμ΄λ‚˜ μ˜ˆμƒμΉ˜ λͺ»ν•œ λ™μž‘μ΄ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.