“สวัสดี อามีโก้!”
"วันนี้ฉันจะบอกคุณว่าการหยุดชะงักคืออะไร"
“เฮ้ คุณเคยบอกฉันเรื่องแบบนี้แล้ว”
"ใช่ ฉันเคย แต่วันนี้เราจะพิจารณาหัวข้อโดยละเอียดมากขึ้น"
"ในกรณีที่ง่ายที่สุด การล็อกตายเกี่ยวข้องกับสองเธรดและออบเจ็กต์ mutex สองรายการ การล็อกร่วมกันเกิดขึ้นเมื่อ:"
A)แต่ละเธรดจำเป็นต้องได้รับทั้งสอง mutexes
B) เธรดแรกได้รับ mutex แรกแล้วและกำลังรอการเปิดตัวอันที่สอง
C) เธรดที่สองได้รับ mutex ที่สองแล้วและกำลังรอการเปิดตัวครั้งแรก
"นี่คือตัวอย่างบางส่วน:
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รับ mutex ของวัตถุ นี้จากนั้นรับ mutex ของวัตถุ เพื่อน "
"ในขณะเดียวกัน เธรดที่สองเรียก เมธอด addFriendรับ mutex ของอ็อบเจ็กต์ friendsจากนั้นรับ mutex ของอ็อบเจ็กต์นี้ (ระหว่างการเรียกgetFriendsCount )"
"ในตอนแรก ทุกอย่างจะปกติดี แต่กฎของเมอร์ฟีกล่าวว่า สิ่งใดผิดพลาดได้ก็จะผิดไป สถานการณ์จะเกิดขึ้นอย่างหลีกเลี่ยงไม่ได้ที่เธรดแรกจะมีเวลาเพียงหนึ่งเดียวในการได้รับมิวเท็กซ์หนึ่ง และเธรดที่สองจะได้รับเธรดที่สอง mutex ในขณะนั้น พวกเขาจะค้างอยู่อย่างนั้น รอตลอดไปสำหรับเธรดอื่นเพื่อปล่อย mutex"
"ฉันตัดสินใจยกตัวอย่างง่ายๆ ที่ฉันพบในหนังสือ:"
class KnightUtil
{
public static void kill(Knight knight1, Knight knight2)
{
synchronized(knight1)
{
synchronized(knight2)
{
knight2.live = 0;
knight1.experience += 100;
}
}
}
}
"มีเกมที่อัศวิน 2 คนต่อสู้กัน อัศวินคนหนึ่งฆ่าอีกฝ่าย พฤติกรรมนี้สะท้อนให้เห็นในวิธีการฆ่าวัตถุอัศวิน 2 ชิ้นถูกส่งผ่านไป
"อย่างแรก เราปกป้องวัตถุทั้งสอง เพื่อไม่ให้ใครมาเปลี่ยนแปลงพวกมันได้"
"อัศวินคนที่สองตาย (HP = 0)"
"อัศวินคนแรกได้รับ 100 XP"
"ทุกอย่างดูเหมือนจะดี แต่อาจมีบางสถานการณ์ที่อัศวินคนที่สองโจมตีคนแรกพร้อมกัน วิธีนี้เรียกอีกอย่างสำหรับอัศวินคนที่สอง แต่สิ่งของอัศวินจะถูกส่งผ่านในลำดับที่ต่างออกไป"
"คุณหมายความว่าเราไม่ต้องการหลายวิธีในการหยุดชะงัก?"
"ใช่แล้ว บางครั้งมันใช้วิธีง่ายๆ เพียงวิธีเดียวในการทำให้เธรดและทั้งโปรแกรมหยุดทำงาน"
"ใช่ ฉันเดาว่าปรากฏการณ์นี้เกิดขึ้นบ่อยกว่าที่ฉันคิด ขอบคุณ เอลลี่"
GO TO FULL VERSION