Search
Duplicate
โ›ณ

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 ๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ
โ†’ ๋‹ค๋ฅธ ๋™์ž‘ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋™์‹œ์„ฑ ์ œ์–ด ์ˆ˜์ค€๊ณผ ์›์ž์„ฑ ๋ณด์žฅ ์—ฌ๋ถ€์˜ ์ฐจ์ด๊ฐ€ ์กด์žฌํ•œ๋‹ค.