deadLock์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ์ „๋žต - 1

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

"๊ต์ฐฉ ์ƒํƒœ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ „๋žต์— ๋Œ€ํ•ด ๋ง์”€๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค."

"๊ฐ€์žฅ ์ข‹์€ ์ „๋žต์€ ์‚ฌ๋ ค ๊นŠ์€ ์•„ํ‚คํ…์ฒ˜์™€ ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ธฐ์™€ ์ˆœ์„œ(๋ฎคํ…์Šค ํš๋“)๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ผ๋ จ์˜ ๊ทœ์น™์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ณ ์ „์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ž ๊ธˆ ๊ณ„์ธต์„ ๊ฐœ๋ฐœํ•˜๊ณ  ํŠน์ • ์ž ๊ธˆ์ด ์ ˆ๋Œ€ ํ•ด์ œ๋  ์ˆ˜ ์—†๋Š” ๊ทœ์น™์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠน์ • ๋‹ค๋ฅธ ์ž ๊ธˆ์ด ์ด๋ฏธ ํš๋“๋œ ์ƒํƒœ์—์„œ ํš๋“๋˜์—ˆ์Šต๋‹ˆ๋‹ค."

"์˜ˆ๋ฅผ ๋“ค์–ด ์ž ๊ธˆ์— ๋ ˆ๋ฒจ์ด ํ• ๋‹น๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋ฉฐ ์Šค๋ ˆ๋“œ๋Š” ๋†’์€ ๋ ˆ๋ฒจ์—์„œ ๋‚ฎ์€ ๋ ˆ๋ฒจ๋กœ ์ˆœ์„œ๋Œ€๋กœ ์ž ๊ธˆ์„ ํš๋“ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋‹จ, ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ์ž ๊ธˆ์„ ํš๋“ํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ). ๋˜ํ•œ ๋™์ผํ•œ ๋ ˆ๋ฒจ์˜ ์ž ๊ธˆ์„ ์—ฌ๋Ÿฌ ๊ฐœ ํš๋“ํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ—ˆ์šฉ๋œ."

"์˜ˆ๋ฅผ ๋“ค์–ด ๊ธฐ์‚ฌ์— ๋Œ€ํ•œ ์ด์ „ ์˜ˆ์—์„œ ๊ฐ ๊ธฐ์‚ฌ์— ๊ณ ์œ  ๋ฒˆํ˜ธ(id)๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋” ํฐ id์—์„œ ๋” ์ž‘์€ id๋กœ ์ž ๊ธˆ์„ ํš๋“ํ•˜๋„๋ก ์š”๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."

์˜ˆ
class KnightUtil
{
 public static void kill(Knight knight1, Knight knight2)
 {
  Knight knightMax = knight1.id > knight2.id ? knight1: knight2;
  Knight knightMin = knight1.id > knight2.id ? knight2: knight1;

  synchronized(knightMax)
  {
   synchronized(knightMin)
   {
    knight2.live = 0;
    knight1.experience +=100;
   }
  }
 }
}

"๊ทธ๊ฑด ์•„๋ฆ„๋‹ค์šด ํ•ด๊ฒฐ์ฑ…์ด๊ตฐ์š”."

"๋งค์šฐ ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์ด์ง€๋งŒ ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. ์ž ์žฌ์ ์ธ ๊ต์ฐฉ ์ƒํƒœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•  ๋•Œ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค."

"๊ณ ๋งˆ์›Œ, ์—˜๋ฆฌ."