Search
β›³

synchronized vs volatile

β€’
λ‘˜ λ‹€ λ™μ‹œμ„± 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ ν‚€μ›Œλ“œ
β€’
λ©”λͺ¨λ¦¬μ—μ„œ λ³€μˆ˜ 값을 μΌκ΄€λ˜κ²Œ μœ μ§€ν•˜λŠ” 방식
β€’
μ“°λ ˆλ“œκ°„ λ©”λͺ¨λ¦¬ κ°€μ‹œμ„± 문제 ν•΄κ²°
β—¦
ν•œ μ“°λ ˆλ“œμ—μ„œ λ³€κ²½ν•œ λ³€μˆ˜λ₯Ό λ‹€λ₯Έ μ“°λ ˆλ“œμ—μ„œ μ μ ˆν•œ 값을 λ³Ό 수 μžˆλŠ”μ§€
β—¦
volatile 은 직접 ν•΄κ²°, sync λŠ” λ©”λͺ¨λ¦¬ 일관성을 μ œκ³΅ν•˜λŠ” 방식

차이점

β€’
sync λŠ” 락을 μ΄μš©ν•˜μ—¬ 경쟁 μƒνƒœλ₯Ό μ°¨λ‹¨ν•˜κ³  μΈμŠ€ν„΄μŠ€ λ³€μˆ˜, 클래슀 λ³€μˆ˜, λ©”μ„œλ“œ λ“± λ‹€μ–‘ν•œ μ½”λ“œ 블둝 동기화 κ°€λŠ₯
β€’
volatile 은 단지 λ³€μˆ˜μ˜ λ©”λͺ¨λ¦¬ κ°€μ‹œμ„±λ§Œ 보μž₯ β†’ ν•œ μ“°λ ˆλ“œμ—μ„œ λ³€μˆ˜λ₯Ό λ³€κ²½ν•˜λ©΄ κ·Έ λ³€κ²½ 사항이 μ¦‰μ‹œ λ‹€λ₯Έ μ“°λ ˆλ“œμ— λ°”λ‘œ λ°˜μ˜λ˜λ„λ‘ 보μž₯, λ³€μˆ˜μ—λ§Œ μ‚¬μš© κ°€λŠ₯
β—¦
λ©€ν‹° μ“°λ ˆλ“œμ—μ„œλŠ” λ©”λͺ¨λ¦¬ 접근을 μ΅œμ ν™”ν•˜κΈ° μœ„ν•΄ 둜컬 μΊμ‹œ(CPU L1, L2, L3 μΊμ‹œ)λ₯Ό μ΄μš©ν•΄μ„œ λ³€μˆ˜ 변경값을 μ œλŒ€λ‘œ 확인할 수 μ—†λŠ” 상황이 μžˆλ‹€.
class MyClass { private boolean flag = false; public void setFlagTrue() { flag = true; // μ“°κΈ° μ—°μ‚° } public void waitForFlag() { while (!flag) { // flagκ°€ trueκ°€ 될 λ•ŒκΉŒμ§€ λŒ€κΈ° } } }
Kotlin
볡사
β—¦
volatile 둜 μ„ μ–Έλœ λ³€μˆ˜λŠ” 곡유 λ©”λͺ¨λ¦¬μ— μ¦‰μ‹œ 기둝되고 λͺ¨λ“  μ“°λ ˆλ“œλŠ” 항상 μ΅œμ‹  값을 μ½λŠ”λ‹€. λͺ…λ Ήμ–΄ μž¬λ°°μΉ˜λ„ λ°©μ–΄ν•œλ‹€.
β—¦
flag λ₯Ό volatile 둜 ν•΄κ²° κ°€λŠ₯
β†’ λ‹€λ₯Έ λ™μž‘ 방식에 따라 λ™μ‹œμ„± μ œμ–΄ μˆ˜μ€€κ³Ό μ›μžμ„± 보μž₯ μ—¬λΆ€μ˜ 차이가 μ‘΄μž¬ν•œλ‹€.