๐Ÿ›‘ ๊ต์ฐฉ ์ƒํƒœ(Deadlock): ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ์˜ ํ•จ์ •๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

์„ํ˜„ยท2025๋…„ 1์›” 27์ผ

Insight

๋ชฉ๋ก ๋ณด๊ธฐ
9/43

์˜ค๋Š˜์˜ ์ด์•ผ๊ธฐ

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋‹ค ๋ณด๋ฉด ์ž์ฃผ ์ ‘ํ•˜๊ฒŒ ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐ”๋กœ ๊ต์ฐฉ ์ƒํƒœ(Deadlock)์ž…๋‹ˆ๋‹ค. ์ตœ๊ทผ ์• ํ”Œ๋ฆฌ์ผ€์…˜์—์„œ Deadlock์ด ๋ฐœ์ƒํ•˜๋ฉด์„œ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๊ณ  ์Šค๋ ˆ๋“œ ๊ฐ„ ์ž์› ๊ณต์œ ๋ฅผ ๊ด€๋ฆฌํ•˜๋‹ค๊ฐ€ ๊ต์ฐฉ ์ƒํƒœ๋ฅผ ์˜ˆ๋ฐฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค์‹œ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ์š”. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๊ต์ฐฉ ์ƒํƒœ์˜ ๊ฐœ๋…, ๋ฐœ์ƒ ์กฐ๊ฑด, ๊ทธ๋ฆฌ๊ณ  ์ž๋ฐ”์—์„œ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.


๊ต์ฐฉ ์ƒํƒœ๋ž€? ๐Ÿค”

๊ต์ฐฉ ์ƒํƒœ(Deadlock)๋ž€ ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ž‘์—…์ด ์„œ๋กœ ์ƒ๋Œ€๋ฐฉ์˜ ์ž‘์—…์ด ๋๋‚˜๊ธฐ๋งŒ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํ™ฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ํ”„๋กœ์„ธ์Šค๋“ค์ด ์•„๋ฌด ์ž‘์—…๋„ ์™„๋ฃŒํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ์— ๋น ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ ์ƒํ™ฉ:

  1. ํ”„๋กœ์„ธ์Šค A๋Š” ์ž์› 1์„ ์ ์œ ํ•˜๊ณ  ์ž์› 2๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  2. ํ”„๋กœ์„ธ์Šค B๋Š” ์ž์› 2๋ฅผ ์ ์œ ํ•˜๊ณ  ์ž์› 1์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  3. ๋‘ ํ”„๋กœ์„ธ์Šค๋Š” ์„œ๋กœ์˜ ์ž์›์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ๋ฉˆ์ถฐ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ต์ฐฉ ์ƒํƒœ ๋ฐœ์ƒ ์กฐ๊ฑด ๐Ÿ“‹

๊ต์ฐฉ ์ƒํƒœ๋Š” ๋‹ค์Œ ๋„ค ๊ฐ€์ง€ ์กฐ๊ฑด์ด ๋™์‹œ์— ๋งŒ์กฑ๋  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค:

  1. ์ƒํ˜ธ ๋ฐฐ์ œ(Mutual Exclusion): ํ•œ ๋ฒˆ์— ํ•œ ํ”„๋กœ์„ธ์Šค๋งŒ ์ž์›์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ ์œ  ๋Œ€๊ธฐ(Hold and Wait): ์ž์›์„ ์ ์œ ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ถ”๊ฐ€ ์ž์›์„ ์š”์ฒญํ•˜๋ฉฐ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.
  3. ๋น„์„ ์ (Non-preemption): ์ด๋ฏธ ํ• ๋‹น๋œ ์ž์›์€ ๊ฐ•์ œ๋กœ ๋นผ์•—์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  4. ์›ํ˜• ๋Œ€๊ธฐ(Circular Wait): ํ”„๋กœ์„ธ์Šค๋“ค์ด ์›ํ˜•์œผ๋กœ ์ž์›์„ ๋Œ€๊ธฐํ•˜๋ฉฐ ์„œ๋กœ ์ž์›์„ ์ ์œ ํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

์ด ๋„ค ๊ฐ€์ง€ ์กฐ๊ฑด์ด ๋™์‹œ์— ์ถฉ์กฑ๋  ๊ฒฝ์šฐ ๊ต์ฐฉ ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ž๋ฐ”์—์„œ์˜ ๊ต์ฐฉ ์ƒํƒœ์™€ ์˜ˆ์ œ ๐Ÿ› ๏ธ

์ž๋ฐ”์—์„œ๋Š” synchronized ํ‚ค์›Œ๋“œ๋‚˜ ReentrantLock์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž˜๋ชป๋œ ์ž์› ํ• ๋‹น ์ˆœ์„œ๋กœ ์ธํ•ด ๊ต์ฐฉ ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ต์ฐฉ ์ƒํƒœ ๋ฐœ์ƒ ์˜ˆ์ œ:

public class DeadlockExample {
    private static final Object resource1 = new Object();
    private static final Object resource2 = new Object();

    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> {
            synchronized (resource1) {
                System.out.println("Thread 1: Locked resource 1");

                try { Thread.sleep(50); } catch (InterruptedException e) {}

                synchronized (resource2) {
                    System.out.println("Thread 1: Locked resource 2");
                }
            }
        });

        Thread thread2 = new Thread(() -> {
            synchronized (resource2) {
                System.out.println("Thread 2: Locked resource 2");

                try { Thread.sleep(50); } catch (InterruptedException e) {}

                synchronized (resource1) {
                    System.out.println("Thread 2: Locked resource 1");
                }
            }
        });

        thread1.start();
        thread2.start();
    }
}

์œ„ ์ฝ”๋“œ์—์„œ๋Š” ์Šค๋ ˆ๋“œ 1๊ณผ ์Šค๋ ˆ๋“œ 2๊ฐ€ ์„œ๋กœ ์ž์›์„ ์ž ๊ทธ๊ณ  ๋Œ€๊ธฐํ•˜๋ฉด์„œ ๊ต์ฐฉ ์ƒํƒœ์— ๋น ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


๊ต์ฐฉ ์ƒํƒœ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ๐Ÿ’ก

1. ์ž์› ํ• ๋‹น ์ˆœ์„œ ์ง€์ •

๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์ž์›์„ ์ผ์ •ํ•œ ์ˆœ์„œ๋กœ ์š”์ฒญํ•˜๋„๋ก ๊ทœ์น™์„ ์ •ํ•˜๋ฉด ์›ํ˜• ๋Œ€๊ธฐ ์กฐ๊ฑด์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ์ฝ”๋“œ:

synchronized (resource1) {
    synchronized (resource2) {
        // ์ž‘์—… ์ˆ˜ํ–‰
    }
}

synchronized (resource1) {
    synchronized (resource2) {
        // ๋™์ผํ•œ ์ˆœ์„œ๋กœ ์ž์› ์š”์ฒญ
    }
}

2. ํƒ€์ž„์•„์›ƒ ์„ค์ •

ReentrantLock์˜ tryLock() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ๋งŒ ์ž์›์„ ๊ธฐ๋‹ค๋ฆฌ๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ์ฝ”๋“œ:

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.TimeUnit;

public class DeadlockResolution {
    private static final Lock lock1 = new ReentrantLock();
    private static final Lock lock2 = new ReentrantLock();

    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> {
            try {
                if (lock1.tryLock(1, TimeUnit.SECONDS)) {
                    try {
                        System.out.println("Thread 1: Locked lock1");
                        Thread.sleep(50);

                        if (lock2.tryLock(1, TimeUnit.SECONDS)) {
                            try {
                                System.out.println("Thread 1: Locked lock2");
                            } finally {
                                lock2.unlock();
                            }
                        }
                    } finally {
                        lock1.unlock();
                    }
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        Thread thread2 = new Thread(() -> {
            try {
                if (lock2.tryLock(1, TimeUnit.SECONDS)) {
                    try {
                        System.out.println("Thread 2: Locked lock2");
                        Thread.sleep(50);

                        if (lock1.tryLock(1, TimeUnit.SECONDS)) {
                            try {
                                System.out.println("Thread 2: Locked lock1");
                            } finally {
                                lock1.unlock();
                            }
                        }
                    } finally {
                        lock2.unlock();
                    }
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        thread1.start();
        thread2.start();
    }
}

3. ์ž์› ์š”์ฒญ ์‹œ๋„ ํ›„ ํฌ๊ธฐ

์ž์›์„ ์–ป์ง€ ๋ชปํ•˜๋ฉด ์ผ์ • ์‹œ๊ฐ„ ํ›„์— ํฌ๊ธฐํ•˜๊ณ  ๋‚˜์ค‘์— ๋‹ค์‹œ ์‹œ๋„ํ•˜๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.


๋งˆ์น˜๋ฉฐ ๐ŸŒŸ

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


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