Volatile
Volatile๋ฅผ ์ค๋ช ํ๊ธฐ ์ , ์ปดํจ์ ์๋ ๋ฐฉ์ ๋ถํฐ ์ค๋ช ํ ์งํํฉ๋๋ค.
CPU์ MEMORY๋ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ต๋๋ค. CPU๋ ๋ง์ ๋ช ๋ น์ ์ํํ๊ธฐ ๋๋ฌธ์ RAM์์ ๊ฐ์ ธ์ค์ง ์๊ณ Out-of-order execution, Branch predictor, Speculative execution, Caching์ ์ด์ฉํฉ๋๋ค
Cpu์ Memory๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ถํฐ ํ์ธํฉ๋๋ค
์ฌ๋ฌ ๋ก์ปฌ ์บ์์ ์ ์ฅ๋๋ ๊ณต์ ๋ฆฌ์์ค ๋ฐ์ดํฐ์ ๊ท ์ผ์ฑ์ ์ผ๊ด๋๊ฒ ๋์ํ๊ฒ ํด์ผ ํฉ๋๋ค. ํ๋ก๊ทธ๋จ์ด ๋ชจ๋ฆฌ ์บ์๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ ์ผ๊ด์ฑ ์๋ ๋ฐ์ดํฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฉฐ, ๋ค์ค ์ฒ๋ฆฌ CPU์์๋ ๋์ฑ ๋๋๋ฌ์ง๋๋ค.
์ ๊ทธ๋ฆผ์ฒ๋ผ Counter๊ฐ ๋ ๊ฐ์ด Memory์ ์ ์ฉ์ด ๋์ง ์์ Reader๊ฐ ๊ณ์ ๋ฐ์๋์ง ์์ ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
volatile
Volatile์ ์ฌ์ฉํ๋ฉด Memory์ ์ ์ฅํ๊ณ ์ฝ๊ฒ๋ฉ๋๋ค. ํ๋์ Thread๋ง Read&Write ํ ์ ์์ผ๋ฉฐ, ๋๋จธ์ง Thread๋ ๊ฐ์ฅ ์ต์ ์ ๊ฐ์ readํ ์ ์๋ค.
How do code?
public class Main {
private static volatile int i = 0;
public static void main(String[] args) {
Runnable counter = () -> {
while (true) {
sleep(100);
i++;
}
};
Runnable reader = () -> {
while (true) {
sleep(300);
System.out.println("value :" + i);
}
};
new Thread(counter).start();
new Thread(reader).start();
}
}
value :2
value :5
value :8
value :11
value :14
value :17
value :20
value :22
value :25
value :28
value :31
value :34
Last updated