์ธํ”„๋Ÿฐ ์ปค๋ฎค๋‹ˆํ‹ฐ ์งˆ๋ฌธ&๋‹ต๋ณ€

ํŒก์„ธ๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
ํŒก์„ธ

์ž‘์„ฑํ•œ ์งˆ๋ฌธ์ˆ˜

CS ์ง€์‹์˜ ์ •์„ | ๋””์ž์ธํŒจํ„ด ๋„คํŠธ์›Œํฌ ์šด์˜์ฒด์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž๋ฃŒ๊ตฌ์กฐ

DEEP DIVE : ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๋Š” 7๊ฐ€์ง€ ๋ฐฉ๋ฒ• #2 โ˜…โ˜…โ˜†

static ๐Ÿ†š volatile

์ž‘์„ฑ

ยท

836

ยท

์ˆ˜์ •๋จ

0

์•ˆ๋…•ํ•˜์„ธ์š”!

 

์ฒซ๋ฒˆ์งธ ์งˆ๋ฌธ์€ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๋Š” 7๊ฐ€์ง€ ๋ฐฉ๋ฒ• #2. LazyHolder, DCL, ENUM ๊ฐ•์˜ ๋‚ด์šฉ์—์„œ

 

  1. static์€ ์ธ์Šคํ„ด์Šค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ์‹œํ‚ด์œผ๋กœ์„œ ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ„ ์˜์กด์ ์ด๋‹ค.

  2. volatile์€ ๊ฐ ์บ์‹œ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์•„๋‹Œ ๋ฉ”์ธ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ์‹œํ‚ด์œผ๋กœ์„œ ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ„ ์˜์กด์ ์ด๋‹ค.

     

๊ทธ๋ ‡๋‹ค๋ฉด static์€ volatile ํ‚ค์›Œ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋ฉ”์ธ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š๊ณ  ๊ฐ ์บ์‹œ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ์ธ์ง€, ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ์ธ์Šคํ„ด์Šค ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ณต์œ ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

 

๋‘๋ฒˆ์งธ ์งˆ๋ฌธ์€, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ์‹œํ‚ด์œผ๋กœ์„œ ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ„ ์˜์กด์ ์ด๊ฒŒ ํ•˜๋Š” ๋™์ž‘์€ static๋„ ๊ฐ€๋Šฅํ•œ๋ฐ ์™œ volatile์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ธ์ง€, static๊ณผ volatile์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!

๋‹ต๋ณ€ 1

0

ํฐ๋Œ๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
ํฐ๋Œ
์ง€์‹๊ณต์œ ์ž

์•ˆ๋…•ํ•˜์„ธ์š” ํŒก์„ธ๋‹˜ใ…Žใ…Ž

  1. static์€ ์ธ์Šคํ„ด์Šค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ์‹œํ‚ด

>> ์–ด๋–ป๊ฒŒ static์œผ๋กœ ์ธ์Šคํ„ด์Šค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ์‹œํ‚ค๋ƒ๋Š” ๋ง์”€์ด์‹œ์ฃ ?

static์œผ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ํด๋ž˜์Šค๋กœ๋”๋‹น ํ•˜๋‚˜์˜ ๋ณ€์ˆ˜๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜

๋™์ผํ•œ ํด๋ž˜์Šค์˜ ํ•œ ์Šค๋ ˆ๋“œ์˜ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋‹ค๋ฅธ ๋ชจ๋“  ์Šค๋ ˆ๋“œ์—๊ฒŒ ๋ฐ”๋กœ ๋ฐ˜์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์บ์‹œ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 image

์•ž์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ static์œผ๋กœ ์„ ์–ธ๋œ staticint๋Š” ๊ฐ๊ฐ์˜ ์Šค๋ ˆ๋“œ๋‚ด์—์„œ ๊ณต์œ ๋˜๊ณ  ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ volatile์€ ๊ฐ๊ฐ์˜ ์Šค๋ž˜๋“œ ์™ธ์—์„œ๋„ ๊ณต์œ ๋˜๊ณ  ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

 

๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ์‹œํ‚ด์œผ๋กœ์„œ ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ„ ์˜์กด์ ์ด๊ฒŒ ํ•˜๋Š” ๋™์ž‘์€ static๋„ ๊ฐ€๋Šฅํ•œ๋ฐ ์™œ volatile์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ธ์ง€, static๊ณผ volatile์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!

>>

static์˜ ๊ฒฝ์šฐ 2๊ฐœ ์Šค๋ ˆ๋“œ(t1, t2)์—์„œ ๊ฐ๊ฐ์˜ ์บ์‹œ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋™์ผํ•œ ๊ฐœ์ฒด์˜ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด ์ˆ˜์ •ํ•˜๋ฏ€๋กœ t1์˜ ์—…๋ฐ์ดํŠธ๊ฐ€ t2์— ๋ฐ˜์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

public class Test {
    static boolean flag = true;

    public void test() {
        new Thread(()->{
                int cnt = 0;
                while (flag) {
                    cnt++;
                }
                System.out.println("Thread1 finished\n");
            }
        ).start();
        new Thread(()-> {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ignored) {
                    
                }
                System.out.println("flag to false");
                flag = false;
            }
        ).start();
    }

    public static void main(String[] args) {
        new Test().test();
    }
}

์ฆ‰ ์•ž์˜ ์ฝ”๋“œ๋Š” ๋ฌดํ•œ๋ฃจํ”„์— ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

volatile์€ ๊ฐ•์˜์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ฉ”์ธ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

๋˜ํ•œ, ํŒก์„ธ๋‹˜ ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ•˜์‹œ๋Š” ๊ฒƒ, ์งˆ๋ฌธํ•˜์‹œ๋Š” ๊ฒƒ์€ ์ •๋ง ์ข‹์œผ๋‚˜ ๊ฐ•์˜ ๋‚ด์šฉ์„ ๊ทธ๋Œ€๋กœ ๋ธ”๋กœ๊ทธ์— ์จ๋†“์œผ์…จ๋Š”๋ฐ... ๊ฐ•์˜๋‚ด์šฉ์„ ๋ธ”๋กœ๊ทธ์— ์“ฐ๋Š” ๊ฒƒ์€ ๊ธˆ์ง€ํ•˜๊ณ  ์žˆ์–ด์„œ์š”. ๋น„๊ณต๊ฐœ ๋˜๋Š” ์‚ญ์ œ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

ํŒก์„ธ๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
ํŒก์„ธ
์งˆ๋ฌธ์ž

์ž์„ธํ•œ ์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์‚ฌ์‹ค ๊ทธ๋ƒฅ ๋ฉด์ ‘์—์„œ ์งˆ๋ฌธ๋ฐ›์„ ๋ชฉ๋ก? ์ •๋„์˜ ์šฉ๋„๋กœ ๋ธ”๋กœ๊ทธ์— ๊ณต๋ถ€๋‚ด์šฉ์„ ์˜ฌ๋ฆฌ๊ณ  ์žˆ๋Š”๋ฐ ๋‹ค๋ฅธ ๊ฐ•์‚ฌ๋‹˜์€ ๊ฐ•์˜ ์ž๋ฃŒ๋ฅผ ์บก์ณํ•˜์—ฌ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•˜์…จ๊ฑฐ๋“ ์š”... ๊ฐ•์˜ ์ถœ์ฒ˜๋ฅผ ๋งํฌ๋กœ ๋ช…์‹œํ•˜๊ณ  ํฌ์ŠคํŒ…ํ•ด๋„ ์•ˆ๋ ๊นŒ์š”??ใ… ใ… 

ํฐ๋Œ๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
ํฐ๋Œ
์ง€์‹๊ณต์œ ์ž

์•ˆ๋…•ํ•˜์„ธ์š” ํŒก์„ธ๋‹˜ ใ…Žใ…Ž

๊ณต๊ฐœ์ ์œผ๋กœ ํฌ์ŠคํŒ…์€ ๋ถˆ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋น„๊ณต๊ฐœ ๋˜๋Š” ์‚ญ์ œ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

ํŒก์„ธ๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
ํŒก์„ธ
์งˆ๋ฌธ์ž

๋„ค ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค..

ํฐ๋Œ๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
ํฐ๋Œ
์ง€์‹๊ณต์œ ์ž

์•„๋‹™๋‹ˆ๋‹ค. ใ…Žใ…Ž ๋ชจ๋ฅด์‹œ๋Š”๊ฑฐ ์žˆ์œผ์‹œ๋ฉด ๋˜ ์งˆ๋ฌธ์ฃผ์„ธ์š”~

ํŒก์„ธ๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
ํŒก์„ธ

์ž‘์„ฑํ•œ ์งˆ๋ฌธ์ˆ˜

์งˆ๋ฌธํ•˜๊ธฐ