๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋นˆ ๊ตฌ๋ฉ ์ฑ„์šฐ๊ธฐ

[Java] volatile ํ‚ค์›Œ๋“œ - ๋ณ€์ˆ˜์˜ ๊ฐ€์‹œ์„ฑ, ์žฌ์ •๋ ฌ ๋ฐฉ์ง€

์ถœ์ฒ˜

ChatGPT


volatile ํ‚ค์›Œ๋“œ๋Š” Java์—์„œ ๋ณ€์ˆ˜์˜ ๊ฐ€์‹œ์„ฑ(visibility)๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ™์€ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ๋Œ€, ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ฐ”๋กœ ์ฝ๊ณ  ์“ฐ๋„๋ก ๋ณด์žฅํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

  • ๋ณ€์ˆ˜์˜ ๊ฐ€์‹œ์„ฑ : ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ, ๊ทธ ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ๋ฐ”๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š”์ง€์˜ ์—ฌ๋ถ€. ๊ฐ€์‹œ์„ฑ์€ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ค‘์š”ํ•œ ๊ฐœ๋…์œผ๋กœ, ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ณ€์ˆ˜์˜ ์ตœ์‹  ์ƒํƒœ๋ฅผ ๋ณด์žฅ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
    • ์ž๋ฐ”์˜ ๋ณ€์ˆ˜ ๊ฐ€์‹œ์„ฑ ๋ฌธ์ œ
      • ์ž๋ฐ”์—์„œ๋Š” ๊ฐ€๊ฐ€ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ณ€์ˆ˜๋ฅผ ์ž์‹ ์˜ CPU ์บ์‹œ ๋˜๋Š” ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅํ•˜๊ณ , ์—ฌ๊ธฐ์— ์ €์žฅ๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ™์€ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๊ฐ’์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ํŠนํžˆ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
      • ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ํŠน์ • ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ–ˆ๋Š”๋ฐ, ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋Š” ์ด ๋ณ€๊ฒฝ ์‚ฌ์‹ค์„ ๋ชจ๋ฅธ ์ฑ„ ์ด์ „ ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ์˜ˆ๋ฅผ ๋“ค์–ด, ์Šค๋ ˆ๋“œ A๊ฐ€ flag ๊ฐ’์„ true๋กœ ๋ณ€๊ฒฝํ–ˆ์ง€๋งŒ, ์Šค๋ ˆ๋“œ B๋Š” ์—ฌ์ „ํžˆ flag์˜ ์ด์ „ ๊ฐ’์ด false๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

volatile ํ‚ค์›Œ๋“œ์˜ ์˜๋ฏธ์™€ ์—ญํ• 

1. ๋ณ€์ˆ˜์˜ ๊ฐ€์‹œ์„ฑ ๋ณด์žฅ

์ผ๋ฐ˜์ ์œผ๋กœ CPU ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ณ  ์ฝ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ์ฆ‰์‹œ ์•Œ์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋‹ค.

volatile๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ญ์ƒ ์ตœ์‹  ๊ฐ’์„ ์ฝ๊ณ  ์“ฐ๋„๋ก ๋ณด์žฅ๋˜๋ฏ€๋กœ, ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ๋„ ์ฆ‰์‹œ ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

2. CPU ์บ์‹œ ๋™๊ธฐํ™”

volatile์€ ๋ชจ๋‘ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์—ฐ์‚ฐ์„ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ํ•ด, ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ ๊ฐ„์— ๊ฐ’์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋„๋ก ํ•œ๋‹ค. ์ฆ‰, ๋ณ€์ˆ˜์˜ ์บ์‹œํ™”๋œ ๋ณต์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๊ฐ’์„ ๋ณด์žฅํ•œ๋‹ค.

 

์˜ˆ์‹œ : volatile ์‚ฌ์šฉ ์˜ˆ

public class SharedObject {
    private volatile boolean flag = false;

    public void setFlagTrue() {
        flag = true;
    }

    public void checkFlag() {
        while (!flag) {
            // ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ flag๊ฐ€ true๋กœ ๋ฐ”๋€Œ๋ฉด ์ด ๋ฃจํ”„๋ฅผ ๋น ์ ธ๋‚˜์˜ต๋‹ˆ๋‹ค.
        }
        System.out.println("Flag is true");
    }
}

 

์—ฌ๊ธฐ์„œ flag ๋ณ€์ˆ˜๋ฅผ volatile๋กœ ์„ ์–ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ flag ๊ฐ’์„ true๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋„ ์ฆ‰์‹œ ์ด ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ์Šค๋ ˆ๋“œ๊ฐ€ flag ๊ฐ’์˜ ์บ์‹œ๋œ ๋ณต์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์–ด while ๋ฃจํ”„๋ฅผ ๋น ์ ธ๋‚˜์˜ค์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์žฌ์ •๋ ฌ volatile์˜ ์—ญํ• 

๋ฉ”๋ชจ๋ฆฌ ์žฌ์ •๋ ฌ์ด๋ž€

์ปดํŒŒ์ผ๋Ÿฌ๋‚˜ CPU๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๋ช…๋ น์–ด ์žฌ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋œ ์ˆœ์„œ๋Œ€๋กœ ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” CPU ํŒŒ์ดํ”„๋ผ์ธ ์ตœ์ ํ™”๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์†๋„ ๋“ฑ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ํ—ˆ์šฉ๋œ๋‹ค.

 

์žฌ์ •๋ ฌ์€ ํ”„๋กœ๊ทธ๋žจ์˜ ๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š๋Š”๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ์™€ CPU๋Š” ์žฌ์ •๋ ฌ ํ›„์—๋„ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ๋™์ผํ•˜๋„๋ก ๋ณด์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ๊ฐ™์€ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์žฌ์ •๋ ฌ์ด ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘์„ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

volatile์˜ ์—ญํ•  

 volatile ํ‚ค์›Œ๋“œ๋Š” ๋ช…๋ น์–ด ์žฌ์ •๋ ฌ์„ ๋ฐฉ์ง€ํ•ด, ํ•ด๋‹น ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ชจ๋“  ์“ฐ๊ธฐ ์—ฐ์‚ฐ์ด ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์ •ํ™•ํ•˜๊ฒŒ ๋ฐ˜์˜๋˜๋„๋ก ๋ณด์žฅํ•œ๋‹ค. ์ฆ‰, volatile๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ˆœ์„œ(barrier)๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋„๋ก ํ•œ๋‹ค.

  • ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ชจ๋“  ๊ณผ์ •์ด ๋๋‚œ ํ›„์— ์ฐธ์กฐ๋ฅผ ํ• ๋‹นํ•˜๋„๋ก ํ•œ๋‹ค.
  • ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ๋•Œ ์™„์ „ํžˆ ์ดˆ๊ธฐํ™”๋œ ์ƒํƒœ๋ฅผ ๋ณด์žฅ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.