DeadLock ๋ฐ ๊ทธ ์›์ธ - 1

"์•ˆ๋…•, ์•„๋ฏธ๊ณ !"

"์˜ค๋Š˜์€ ๊ต์ฐฉ ์ƒํƒœ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ๋ ค ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค."

"์ด๋ด, ๋‹น์‹ ์€ ์ด๋ฏธ ๊ทธ๋Ÿฐ ๊ฒƒ์— ๋Œ€ํ•ด ๋‚˜์—๊ฒŒ ๋งํ–ˆ๋‹ค."

"์˜ˆ, ๊ทธ๋žฌ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์˜ค๋Š˜์€ ๊ทธ ์ฃผ์ œ๋ฅผ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค."

"๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ ๊ต์ฐฉ ์ƒํƒœ์—๋Š” ๋‘ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ์™€ ๋‘ ๊ฐœ์˜ ๋ฎคํ…์Šค ๊ฐœ์ฒด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ์ƒํ˜ธ ์ž ๊ธˆ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค."

A) ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ๋‘ ๋ฎคํ…์Šค๋ฅผ ํš๋“ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

B)  ์ฒซ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๋ฎคํ…์Šค๋ฅผ ํš๋“ํ–ˆ์œผ๋ฉฐ ๋‘ ๋ฒˆ์งธ ๋ฎคํ…์Šค๊ฐ€ ํ•ด์ œ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

C)  ๋‘ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‘ ๋ฒˆ์งธ ๋ฎคํ…์Šค๋ฅผ ํš๋“ํ–ˆ์œผ๋ฉฐ ์ฒซ ๋ฒˆ์งธ ๋ฎคํ…์Šค๊ฐ€ ํ•ด์ œ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

"์—ฌ๊ธฐ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๊ฐ€ ์žˆ์–ด์š”:

์˜ˆ
 public class Student
{
 private ArrayList friends = new ArrayList();

 public synchronized ArrayList getFriends()
 {
  synchronized(friends)
  {
   return new ArrayList(friends);
  }
 }

 public synchronized int getFriendsCount()
 {
  return friends.size();
 }

 public int addFriend(Student student)
 {
  synchronized(friends)
  {
   friends.add(student)
   return getFriendsCount ();
  }
 }
}

"์Šค๋ ˆ๋“œ๊ฐ€ getFriends ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ด ๊ฐœ์ฒด์˜ ๋ฎคํ…์Šค๋ฅผ ํš๋“ํ•œ ๋‹ค์Œ friend ๊ฐœ์ฒด์˜ ๋ฎคํ…์Šค๋ฅผ ํš๋“ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค."

"ํ•œํŽธ ๋‘ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ๋Š” addFriend ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์นœ๊ตฌ ๊ฐœ์ฒด์˜ ๋ฎคํ…์Šค๋ฅผ ํš๋“ ํ•œ ๋‹ค์Œ ์ด ๊ฐœ์ฒด์˜ ๋ฎคํ…์Šค๋ฅผ ํš๋“ํ•ฉ๋‹ˆ๋‹ค( getFriendsCount ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋™์•ˆ )."

"์ฒ˜์Œ์—๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ๋˜๊ฒ ์ง€๋งŒ ๋จธํ”ผ์˜ ๋ฒ•์น™์— ๋”ฐ๋ฅด๋ฉด ์ž˜๋ชป๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์€ ์ž˜๋ชป๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ๋ฎคํ…์Šค๋ฅผ ํš๋“ํ•  ์‹œ๊ฐ„๋งŒ ์žˆ๊ณ  ๋‘ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‘ ๋ฒˆ์งธ ๋ฎคํ…์Šค๋ฅผ ํš๋“ํ•˜๋Š” ์ƒํ™ฉ์ด ํ•„์—ฐ์ ์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ ๊ทธ ์ˆœ๊ฐ„์— ๋ฎคํ…์Šค. ๊ทธ๋“ค์€ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฎคํ…์Šค๋ฅผ ํ•ด์ œํ•˜๊ธฐ๋ฅผ ์˜์›ํžˆ ๊ธฐ๋‹ค๋ฆฌ๋ฉด์„œ ๊ทธ๋ ‡๊ฒŒ ๋งค๋‹ฌ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค."

"๋‚˜๋Š” ์ฑ…์—์„œ ์ฐพ์€ ๋˜ ๋‹ค๋ฅธ ๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ์ธ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค."

์˜ˆ
class KnightUtil
{
 public static void kill(Knight knight1, Knight knight2)
 {
  synchronized(knight1)
  {
   synchronized(knight2)
   {
    knight2.live = 0;
    knight1.experience += 100;
   }
  }
 }
}

"๋‘ ๋ช…์˜ ๊ธฐ์‚ฌ๊ฐ€ ์„œ๋กœ ์‹ธ์šฐ๋Š” ๊ฒŒ์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ธฐ์‚ฌ๊ฐ€ ๋‹ค๋ฅธ ๊ธฐ์‚ฌ๋ฅผ ์ฃฝ์ž…๋‹ˆ๋‹ค. ์ด ๋™์ž‘์€ kill ๋ฉ”์„œ๋“œ์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค . ๋‘ ๊ธฐ์‚ฌ ๊ฐœ์ฒด๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

"์ฒซ์งธ, ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋„๋ก ๋‘ ๊ฐœ์ฒด๋ฅผ ๋ชจ๋‘ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค."

"๋‘ ๋ฒˆ์งธ ๊ธฐ์‚ฌ ์‚ฌ๋ง(HP = 0)"

"์ฒซ ๋ฒˆ์งธ ๊ธฐ์‚ฌ๋Š” 100 XP๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค."

"๋‹ค ๊ดœ์ฐฎ์•„ ๋ณด์ด์ง€๋งŒ, ๋‘ ๋ฒˆ์งธ ๊ธฐ์‚ฌ๊ฐ€ ๋™์‹œ์— ์ฒซ ๋ฒˆ์งธ ๊ธฐ์‚ฌ๋ฅผ ๊ณต๊ฒฉํ•˜๋Š” ์ƒํ™ฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๋‘ ๋ฒˆ์งธ ๊ธฐ์‚ฌ์—๋„ ํ˜ธ์ถœ๋˜์ง€๋งŒ ๊ธฐ์‚ฌ ์˜ค๋ธŒ์ ํŠธ๋Š” ๋‹ค๋ฅธ ์ˆœ์„œ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค."

"๊ต์ฐฉ ์ƒํƒœ์— ๋น ์ง€๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๋œป์ž…๋‹ˆ๊นŒ?"

"๋งž์•„์š”. ๋•Œ๋กœ๋Š” ํ•˜๋‚˜์˜ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•๋งŒ ์žˆ์œผ๋ฉด ์Šค๋ ˆ๋“œ์™€ ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค."

"๋„ค, ์ƒ๊ฐ๋ณด๋‹ค ์ด๋Ÿฐ ํ˜„์ƒ์ด ์ž์ฃผ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ ๊ฐ™์•„์š”. ๊ณ ๋งˆ์›Œ์š”, ์—˜๋ฆฌ."