“สวัสดี อามีโก้!”
"ฉันต้องการบอกคุณเกี่ยวกับกลยุทธ์สองสามข้อเพื่อหลีกเลี่ยงการหยุดชะงัก"
"กลยุทธ์ที่ดีที่สุดคือสถาปัตยกรรมที่รอบคอบและชุดของกฎที่ควบคุมว่าเมื่อใดและในลำดับใดที่คุณสามารถใช้การล็อก (ได้รับ 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;
}
}
}
}
"นั่นเป็นวิธีแก้ปัญหาที่สวยงาม"
"มันเป็นวิธีแก้ปัญหาที่ง่ายมาก แต่ฉันชอบมัน ฉันหวังว่ามันจะเป็นประโยชน์กับคุณเมื่อคุณคิดถึงวิธีแก้ปัญหาการหยุดชะงักที่อาจเกิดขึ้น"
“ขอบคุณนะเอลลี่”
GO TO FULL VERSION