กลยุทธ์เพื่อหลีกเลี่ยงการหยุดชะงัก - 1

“สวัสดี อามีโก้!”

"ฉันต้องการบอกคุณเกี่ยวกับกลยุทธ์สองสามข้อเพื่อหลีกเลี่ยงการหยุดชะงัก"

"กลยุทธ์ที่ดีที่สุดคือสถาปัตยกรรมที่รอบคอบและชุดของกฎที่ควบคุมว่าเมื่อใดและในลำดับใดที่คุณสามารถใช้การล็อก (ได้รับ mutexes) วิธีการแบบคลาสสิกในการแก้ปัญหาคือการพัฒนาลำดับชั้นของการล็อก และสร้างกฎที่การล็อกบางอย่างไม่สามารถทำได้ ได้รับในสถานะที่ได้รับล็อคอื่น ๆ บางอย่างแล้ว "

"ตัวอย่างเช่น บางครั้งการล็อกถูกกำหนดระดับ และเธรดจำเป็นต้องได้รับการล็อกตามลำดับจากระดับที่สูงกว่าไปยังระดับที่ต่ำกว่า (แต่ไม่อนุญาตให้รับการล็อกในทิศทางอื่น) นอกจากนี้ การรับการล็อกหลายรายการที่มีระดับเดียวกันไม่ได้ อนุญาต."

"ตัวอย่างเช่น ในตัวอย่างก่อนหน้านี้กับอัศวิน เราสามารถเพิ่มหมายเลขเฉพาะ (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;
   }
  }
 }
}

"นั่นเป็นวิธีแก้ปัญหาที่สวยงาม"

"มันเป็นวิธีแก้ปัญหาที่ง่ายมาก แต่ฉันชอบมัน ฉันหวังว่ามันจะเป็นประโยชน์กับคุณเมื่อคุณคิดถึงวิธีแก้ปัญหาการหยุดชะงักที่อาจเกิดขึ้น"

“ขอบคุณนะเอลลี่”