๐Ÿš€ "๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ผฌ์ธ๋‹ค?! (feat. synchronized, ReentrantLock, volatile)"

์„ํ˜„ยท2025๋…„ 3์›” 17์ผ

Insight

๋ชฉ๋ก ๋ณด๊ธฐ
29/43
post-thumbnail

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

์˜ค๋Š˜์€ ์ž๋ฐ”์—์„œ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์ธ synchronized, ReentrantLock, volatile ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿšฉ CPU ์บ์‹œ ๋ฌธ์ œ๋ž€ ์ •ํ™•ํžˆ ๋ญ˜๊นŒ์š”?

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

์ด๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฌธ์ œ๊ฐ€ ์›์ž์„ฑ(Atomicity)๊ณผ ๊ฐ€์‹œ์„ฑ(Visibility)์ž…๋‹ˆ๋‹ค.

  • ์›์ž์„ฑ: ์—ฐ์‚ฐ์ด ์ค‘๊ฐ„์— ์ค‘๋‹จ๋˜์ง€ ์•Š๊ณ  ํ•œ ๋ฒˆ์— ์™„๋ฃŒ๋˜์–ด์•ผ ํ•˜๋Š” ์„ฑ์งˆ์ž…๋‹ˆ๋‹ค.
  • ๊ฐ€์‹œ์„ฑ: ํ•œ ์Šค๋ ˆ๋“œ์—์„œ ๋ณ€๊ฒฝ๋œ ๊ฐ’์ด ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ๋„ ๋ฐ”๋กœ ํ™•์ธ ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋Š” ์„ฑ์งˆ์ž…๋‹ˆ๋‹ค.

์ž๋ฐ”์—์„œ์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ๐Ÿ”ฅ

์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ฐ”๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š”๋ฐ์š”, ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” synchronized, ReentrantLock, ๊ทธ๋ฆฌ๊ณ  volatile ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃ synchronized ํ‚ค์›Œ๋“œ

synchronized๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฉ”์†Œ๋“œ ๋˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก์„ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ์›์ž์„ฑ๊ณผ ๊ฐ€์‹œ์„ฑ์„ ๋ชจ๋‘ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”– ์˜ˆ์ œ ์ฝ”๋“œ

class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;  // ์ด ์—ฐ์‚ฐ์€ ์›์ž์ ์ด๋ฉฐ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฐฉํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
    }

    public synchronized int getCount() {
        return count; // ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋„ ํ•ญ์ƒ ์ตœ์‹  ๊ฐ’์„ ํ™•์ธ ๊ฐ€๋Šฅ
    }
}

2๏ธโƒฃ ReentrantLock

ReentrantLock์€ synchronized๋ณด๋‹ค ๋” ์œ ์—ฐํ•œ ๋ฝ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฝ ํš๋“ ๋ฐ ํ•ด์ œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์กฐ๊ฑด๋ณ„๋กœ ์ž ๊ธˆ์„ ๋‚˜๋ˆ„๊ฑฐ๋‚˜ ์ธํ„ฐ๋ŸฝํŠธ ๊ฐ€๋Šฅํ•œ ๋ฝ๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ:

import java.util.concurrent.locks.ReentrantLock;

public class SafeCounter {
    private int count = 0;
    private final ReentrantLock lock = new ReentrantLock();

    public void increment() {
        lock.lock();
        try {
            count++; // ์›์ž์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
        } finally {
            lock.unlock();
        }
    }

    public int getCount() {
        lock.lock();
        try {
            return count;
        } finally {
            lock.unlock();
        }
    }
}

3๏ธโƒฃ volatile ํ‚ค์›Œ๋“œ

volatile ํ‚ค์›Œ๋“œ๋Š” ๊ฐ€์‹œ์„ฑ๋งŒ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฆ‰์‹œ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•˜์ง€๋งŒ, ์›์ž์„ฑ์„ ๋ณด์žฅํ•˜์ง€๋Š” ์•Š์œผ๋ฏ€๋กœ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

public class FlagManager {
    private volatile boolean flag = false;

    public void activate() {
        flag = true; // ์ฆ‰์‹œ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ˜์˜๋˜์–ด ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ํ™•์ธ ๊ฐ€๋Šฅ
    }

    public boolean isFlagSet() {
        return flag;
    }
}

๐ŸŽฏ ์–ธ์ œ, ์–ด๋–ค ๊ฑธ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”?

  • synchronized: ๊ฐ„๋‹จํ•œ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•  ๋•Œ, ๋ฉ”์†Œ๋“œ๋‚˜ ์ฝ”๋“œ ๋ธ”๋ก ๋‹จ์œ„๋กœ ์›์ž์„ฑ๊ณผ ๊ฐ€์‹œ์„ฑ์„ ์‰ฝ๊ฒŒ ๋ณด์žฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ReentrantLock: ๋” ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ์„ธ๋ฐ€ํ•˜๊ฒŒ ๋ฝ์„ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.
  • volatile: ๊ฐ„๋‹จํžˆ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜๊ณ , ์ตœ์‹  ์ƒํƒœ๋งŒ ๋ฐ˜์˜ํ•˜๋ฉด ๋˜๋Š” ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ณ€๊ฒฝ์ด ์ž์ฃผ ์žˆ๊ฑฐ๋‚˜ ์›์ž์„ฑ์„ ๋ณด์žฅํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋ถ€์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

๐Ÿšง ์ฃผ์˜ํ•  ์ 

๋™๊ธฐํ™” ์ž‘์—…์„ ๋„ˆ๋ฌด ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ผญ ํ•„์š”ํ•œ ๊ณณ์—๋งŒ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž˜๋ชป๋œ ๋™๊ธฐํ™” ์‚ฌ์šฉ์€ ๊ต์ฐฉ ์ƒํƒœ(Deadlock)๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํ•ญ์ƒ ์‹ ์ค‘ํ•˜๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿš€ ๋งˆ๋ฌด๋ฆฌ

์ž๋ฐ”์˜ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋™์‹œ์„ฑ ๋ฌธ์ œ๋Š” ์–ด๋ ต๊ณ  ๊นŒ๋‹ค๋กญ์ง€๋งŒ, ์œ„ ๋ฐฉ๋ฒ•๋“ค์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋ฉด ์•„์ฃผ ๊น”๋”ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์›์ž์„ฑ๊ณผ ๊ฐ€์‹œ์„ฑ ๋ฌธ์ œ๋กœ ๊ณ ๋ฏผํ•˜์ง€ ๋งˆ์‹œ๊ณ , ์ด ๋ธ”๋กœ๊ทธ์—์„œ ์„ค๋ช…ํ•œ ๋ฐฉ๋ฒ•๋“ค์„ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•ด ๋ณด์„ธ์š”! ๐Ÿ’ช

0๊ฐœ์˜ ๋Œ“๊ธ€