Volatile

Volatile๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์ „, ์ปดํ“จ์˜ ์ž‘๋™ ๋ฐฉ์‹ ๋ถ€ํ„ฐ ์„ค๋ช…ํ›„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

CPU์™€ MEMORY๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์Šต๋‹ˆ๋‹ค. CPU๋Š” ๋งŽ์€ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— RAM์—์„œ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ  Out-of-order execution, Branch predictor, Speculative execution, Caching์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค

Cpu์™€ Memory๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ถ€ํ„ฐ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค

Drawing
Cpu&Memory

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

Drawing

์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ Counter๊ฐ€ ๋œ ๊ฐ’์ด Memory์— ์ ์šฉ์ด ๋˜์ง€ ์•Š์•„ Reader๊ฐ€ ๊ณ„์† ๋ฐ˜์˜๋˜์ง€ ์•Š์€ ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

volatile

Volatile์„ ์‚ฌ์šฉํ•˜๋ฉด Memory์— ์ €์žฅํ•˜๊ณ  ์ฝ๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ Thread๋งŒ Read&Write ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‚˜๋จธ์ง€ Thread๋Š” ๊ฐ€์žฅ ์ตœ์‹ ์˜ ๊ฐ’์„ readํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๋Ÿฌ Thread๊ฐ€ ์ฝ๊ธฐ ์ž‘์—…์„ ํ•˜๋Š” ๊ฒฝ์šฐ์—” ์ ํ•ฉํ•˜์ง€ ์•Š์œผ๋‹ˆ Synronized๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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