DeadLock และสาเหตุของมัน - 1

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

"วันนี้ฉันจะบอกคุณว่าการหยุดชะงักคืออะไร"

“เฮ้ คุณเคยบอกฉันเรื่องแบบนี้แล้ว”

"ใช่ ฉันเคย แต่วันนี้เราจะพิจารณาหัวข้อโดยละเอียดมากขึ้น"

"ในกรณีที่ง่ายที่สุด การล็อกตายเกี่ยวข้องกับสองเธรดและออบเจ็กต์ 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"

"ทุกอย่างดูเหมือนจะดี แต่อาจมีบางสถานการณ์ที่อัศวินคนที่สองโจมตีคนแรกพร้อมกัน วิธีนี้เรียกอีกอย่างสำหรับอัศวินคนที่สอง แต่สิ่งของอัศวินจะถูกส่งผ่านในลำดับที่ต่างออกไป"

"คุณหมายความว่าเราไม่ต้องการหลายวิธีในการหยุดชะงัก?"

"ใช่แล้ว บางครั้งมันใช้วิธีง่ายๆ เพียงวิธีเดียวในการทำให้เธรดและทั้งโปรแกรมหยุดทำงาน"

"ใช่ ฉันเดาว่าปรากฏการณ์นี้เกิดขึ้นบ่อยกว่าที่ฉันคิด ขอบคุณ เอลลี่"