Java Volatile์ด๋ž€?

  • volatile keyword๋Š” Java ๋ณ€์ˆ˜๋ฅผ Main Memory์— ์ €์žฅํ•˜๊ฒ ๋‹ค๋ผ๋Š” ๊ฒƒ์„ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋งค๋ฒˆ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ Readํ•  ๋•Œ๋งˆ๋‹ค CPU cache์— ์ €์žฅ๋œ ๊ฐ’์ด ์•„๋‹Œ Main Memory์—์„œ ์ฝ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ Writeํ•  ๋•Œ๋งˆ๋‹ค Main Memory์— ๊นŒ์ง€ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์™œ(Why) ํ•„์š”ํ• ๊นŒ์š”?

  • volatile ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€ ์•Š๋Š” MultiThread ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” Task๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด Main Memory์—์„œ ์ฝ์€ ๋ณ€์ˆ˜ ๊ฐ’์„ CPU Cache์— ์ €์žฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ์— Multi Threadํ™˜๊ฒฝ์—์„œ Thread๊ฐ€ ๋ณ€์ˆ˜ ๊ฐ’์„ ์ฝ์–ด์˜ฌ ๋•Œ ๊ฐ๊ฐ์˜ CPU Cache์— ์ €์žฅ๋œ ๊ฐ’์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜ ๊ฐ’ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Example

  • SharedObject๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋‘ ๊ฐœ์˜ Thread๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
    • Thread-1๋Š” counter ๊ฐ’์„ ๋”ํ•˜๊ณ  ์ฝ๋Š” ์—ฐ์‚ฐ์„ ํ•ฉ๋‹ˆ๋‹ค. (Read & Write)
    • Thread-2๋Š” counter ๊ฐ’์„ ์ฝ๊ธฐ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.(Only Read)
public class SharedObject {
    public int counter = 0;
}

Thread-1์€ counter๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ์žˆ์ง€๋งŒ CPU Cache์—๋งŒ ๋ฐ˜์˜๋˜์–ด์žˆ๊ณ  ์‹ค์ œ๋กœ Main Memory์—๋Š” ๋ฐ˜์˜์ด ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Thread-2๋Š” count๊ฐ’์„ ๊ณ„์† ์ฝ์–ด์˜ค์ง€๋งŒ 0์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ(How) ํ•ด๊ฒฐํ• ๊นŒ์š”?

  • volatile ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๋ฉด Main Memory์— ์ €์žฅํ•˜๊ณ  ์ฝ์–ด์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜ ๊ฐ’ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
public class SharedObject {
    public volatile int counter = 0;
}

์–ธ์ œ(When) Volatile์ด ์ ํ•ฉํ• ๊นŒ์š”?

  • Multi Thread ํ™˜๊ฒฝ์—์„œ ํ•˜๋‚˜์˜ Thread๋งŒ read & writeํ•˜๊ณ  ๋‚˜๋จธ์ง€ Thread๊ฐ€ readํ•˜๋Š” ์ƒํ™ฉ์—์„œ ๊ฐ€์žฅ ์ตœ์‹ ์˜ ๊ฐ’์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

ํ•ญ์ƒ Volatile์ด ์˜ณ์„๊นŒ์š”?

Example

  • Thread-1์ด ๊ฐ’์„ ์ฝ์–ด 1์„ ์ถ”๊ฐ€ํ•˜๋Š” ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์ถ”๊ฐ€ํ•˜๋Š” ์—ฐ์‚ฐ์„ ํ–ˆ์ง€๋งŒ ์•„์ง Main Memory์— ๋ฐ˜์˜๋˜๊ธฐ ์ „ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.
  • Thread-2์ด ๊ฐ’์„ ์ฝ์–ด 1์„ ์ถ”๊ฐ€ํ•˜๋Š” ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์ถ”๊ฐ€ํ•˜๋Š” ์—ฐ์‚ฐ์„ ํ–ˆ์ง€๋งŒ ์•„์ง Main Memory์— ๋ฐ˜์˜๋˜๊ธฐ ์ „ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.
  • ๋‘ ๊ฐœ์˜ Thread๊ฐ€ 1์„ ์ถ”๊ฐ€ํ•˜๋Š” ์—ฐ์‚ฐ์„ ํ•˜์—ฌ ์ตœ์ข…๊ฒฐ๊ณผ๊ฐ€ 2๊ฐ€ ๋˜์–ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด์ง€๋งŒ?
    • ๊ฐ๊ฐ ๊ฒฐ๊ณผ๋ฅผ Main Memory์— ๋ฐ˜์˜ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด 1๋งŒ ๋‚จ๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • ํ•˜๋‚˜์˜ Thread๊ฐ€ ์•„๋‹Œ ์—ฌ๋Ÿฌ Thread๊ฐ€ writeํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ Thread๊ฐ€ writeํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด?
    • synchronized๋ฅผ ํ†ตํ•ด ๋ณ€์ˆ˜ read & write์˜ ์›์ž์„ฑ(atomic)์„ ๋ณด์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Volatile ์„ฑ๋Šฅ์— ์–ด๋–ค ์˜ํ–ฅ์ด ์žˆ์„๊นŒ์š”?

  • volatile๋Š” ๋ณ€์ˆ˜์˜ read์™€ write๋ฅผ Main Memory์—์„œ ์ง„ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • CPU Cache๋ณด๋‹ค Main Memory๊ฐ€ ๋น„์šฉ์ด ๋” ํฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜ ๊ฐ’ ์ผ์น˜์„ ๋ณด์žฅํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ volatile ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด?

  • volatile
    • Main Memory์— read & write๋ฅผ ๋ณด์žฅํ•˜๋Š” ํ‚ค์›Œ๋“œ.
  • ์ƒํ™ฉ?
    • ํ•˜๋‚˜์˜ Thread๊ฐ€ writeํ•˜๊ณ  ๋‚˜๋จธ์ง€ Thread๊ฐ€ ์ฝ๋Š” ์ƒํ™ฉ์ธ ๊ฒฝ์šฐ.
    • ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์ตœ์‹ ์˜ ๊ฐ’์œผ๋กœ ์ฝ์–ด์™€์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ.
  • ์ฃผ์˜ํ•  ์ ?
    • ์„ฑ๋Šฅ์— ์˜ํ–ฅ์ด ์–ด๋Š ์ •๋„ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” Point๋ผ๋Š” ์ .

Reference