์‹์‚ฌํ•˜๋Š” ์ฒ ํ•™์ž ๋ฌธ์ œ๋Š” ์›ํ˜• ํ…Œ์ด๋ธ”์— 5๋ช…์˜ ์ฒ ํ•™์ž์™€ 5๊ฐœ์˜ ์ “๊ฐ€๋ฝ์ด ์žˆ๋Š” ์ƒํ™ฉ์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž. ๊ฐ ์ฒ ํ•™์ž๋Š” ์ƒ๊ฐํ•˜๊ณ  ์‹์‚ฌํ•˜๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์‹์‚ฌํ•˜๊ณ ๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค. ๋‹จ, ์‹์‚ฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 2๊ฐœ์˜ ์ “๊ฐ€๋ฝ์ด ํ•„์š”ํ•˜๋‹ค.

์ด ์ƒํ™ฉ์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•ด๋ณด์ž. ์ “๊ฐ€๋ฝ์€ ํ•œ ์ฒ ํ•™์ž๊ฐ€ ๊ฐ€์ ธ๊ฐ€๋ฉด ๋‹ค๋ฅธ ์ฒ ํ•™์ž๋Š” ์ด ์ “๊ฐ€๋ฝ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ํ•œ ์ “๊ฐ€๋ฝ์— ๋™์‹œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ฒ ํ•™์ž๋Š” ํ•œ ๋ช…๋ฟ์ด๋ฏ€๋กœ ์ “๊ฐ€๋ฝ์€ ์„ธ๋งˆํฌ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.(number of permit = 1) ํ•œ ์ฒ ํ•™์ž๊ฐ€ ์‹์‚ฌ๋ฅผ ํ•˜๋ ค๊ณ  ํ•˜๋ฉด, ์™ผ์ชฝ ์ “๊ฐ€๋ฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์ “๊ฐ€๋ฝ ์ˆœ์„œ๋กœ ๊ฐ€์ ธ๊ฐ€๊ณ , ์‹์‚ฌ๊ฐ€ ๋๋‚˜๋ฉด ๋™์ผํ•˜๊ฒŒ ์™ผ์ชฝ ์ “๊ฐ€๋ฝ, ์˜ค๋ฅธ์ชฝ ์ “๊ฐ€๋ฝ ์ˆœ์„œ๋กœ ๋‚ด๋ ค๋†“๋Š”๋‹ค.

3.1 Code

import java.util.concurrent.Semaphore;
 
class Philosopher extends Thread {
	int id; // philosopher id
	Semaphore lstick, rstick; // left, right chopsticks
	Philosopher(int id, Semaphore lstick, Semaphore rstick) {
		this.id = id;
		this.lstick = lstick;
		this.rstick = rstick;
	}
 
	public void run() {
		try {
			while (true) {
				lstick.acquire();
				rstick.acquire();
				eating();
				lstick.release();
				rstick.release();
				thinking();
			}
		}catch (InterruptedException e) { }
	}
 
	void eating() {
		System.out.println("[" + id + "] eating");
	}
 
	void thinking() {
		System.out.println("[" + id + "] thinking");
	}
}
 
class Test {
	static final int num = 5; // number of philosphers & chopsticks
	public static void main(String[] args) {
        int i;
        /* chopsticks */
        Semaphore[] stick = new Semaphore[num];
        for (i=0; i<num; i++)
            stick[i] = new Semaphore(1);
        /* philosophers */
        Philosopher[] phil = new Philosopher[num];
        for (i=0; i<num; i++)
            phil[i] = new Philosopher(i, stick[i], stick[(i+1)%num]);
        /* let philosophers eat and think */
        for (i=0; i<num; i++)
            phil[i].start();
      }
}

5๊ฐœ์˜ ์ “๊ฐ€๋ฝ ์„ธ๋งˆํฌ์™€ 5๋ช…์˜ ์ฒ ํ•™์ž ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๊ฐ ์ฒ ํ•™์ž ์“ฐ๋ ˆ๋“œ์—๋Š” ๋ฌดํ•œ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์™ผ์ชฝ ์ “๊ฐ€๋ฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์ “๊ฐ€๋ฝ์„ ์ˆœ์„œ๋Œ€๋กœ ์ง‘์€ ํ›„ ์‹์‚ฌ๋ฅผ ํ•˜๊ณ (๋ช‡ ๋ฒˆ ์ฒ ํ•™์ž๊ฐ€ ์‹์‚ฌํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™”๋ฉด์— ์ถœ๋ ฅ), ๋‹ค์‹œ ์™ผ์ชฝ ์ “๊ฐ€๋ฝ, ์˜ค๋ฅธ์ชฝ ์ “๊ฐ€๋ฝ ์ˆœ์œผ๋กœ ๋‚ด๋ ค๋†“๊ณ  ์ƒ๊ฐ์„ ํ•œ๋‹ค.

๋‹จ์ˆœํžˆ ์ฝ”๋“œ๋ฅผ ๋ด์„œ๋Š” ๋ฌธ์ œ์ ์ด ์—†์–ด๋ณด์ธ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ค‘๊ฐ„์— ๋ฉˆ์ถ”๊ณ  ๋”์ด์ƒ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Š” ๋Œ€ํ‘œ์ ์ธ starvation ๋ฌธ์ œ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋ชจ๋“  ์ฒ ํ•™์ž๊ฐ€ ์‹์‚ฌ๋ฅผ ํ•˜์ง€ ๋ชปํ•˜๊ณ  ๊ตถ์–ด์ฃฝ๋Š” ์ƒํ™ฉ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Š” ๋งค์šฐ ๋“œ๋ฌธ ์ƒํ™ฉ์œผ๋กœ ๋ชจ๋“  ์ฒ ํ•™์ž๊ฐ€ ๋™์‹œ์— ์‹์‚ฌ๋ฅผ ํ•˜๋ ค๊ณ  ์™ผ์ชฝ ์ “๊ฐ€๋ฝ์„ ์ง‘์—ˆ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด 5๋ช…์˜ ์ฒ ํ•™์ž๊ฐ€ 5๊ฐœ์˜ ์ “๊ฐ€๋ฝ์„ ๋ชจ๋‘ ์ง‘์–ด๋“  ์ƒํ™ฉ์ด๋‹ค. ๊ทธ ๊ฒฐ๊ณผ, ๋‚จ์•„์žˆ๋Š” ์ “๊ฐ€๋ฝ์€ ๋” ์ด์ƒ์—†๊ณ  ๋ชจ๋“  ์ฒ ํ•™์ž๊ฐ€ ๋ฐ˜๋Œ€ํŽธ ์ “๊ฐ€๋ฝ์„ ๋“ค๊ธฐ ์œ„ํ•ด ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹์‚ฌํ•  ์ˆ˜ ์žˆ๋Š” ์ฒ ํ•™์ž๋Š” ์—†์œผ๋ฏ€๋กœ ์•„๋ฌด๋„ ์ “๊ฐ€๋ฝ์€ ๋‚ด๋ ค๋†“์ง€ ์•Š๊ณ  ํ•˜์—ผ์—†์ด ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ๊ต์ฐฉ์ƒํƒœ(deadlock) ๋ผ๊ณ  ํ•œ๋‹ค. ์˜ค์˜ค๋ฏธ

Reference