Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

เราจะหลีกเลี่ยงการชะงักงันใน Java ได้อย่างไร?


ใน Java การหยุดชะงัก เป็นสถานการณ์การเขียนโปรแกรมที่ สองเธรดขึ้นไปถูกบล็อกอย่างถาวร . เงื่อนไขการชะงักงันจะเกิดขึ้นอย่างน้อย สองเธรด และทรัพยากรสองอย่างขึ้นไป .

วิธีหลีกเลี่ยงการหยุดชะงัก

  • หลีกเลี่ยงการล็อกแบบซ้อน :การชะงักงันส่วนใหญ่เกิดขึ้นเมื่อเราทำการล็อคหลายเธรด หลีกเลี่ยงการล็อกหลายชุดข้อความหากเราให้ชุดเดียวแล้ว
  • หลีกเลี่ยงการล็อกที่ไม่จำเป็น :ล็อคได้เฉพาะสมาชิกที่จำเป็นเท่านั้น การล็อกโดยไม่จำเป็นอาจนำไปสู่การหยุดชะงักได้
  • ใช้ Thread.join(): เงื่อนไขการชะงักงันปรากฏขึ้นเมื่อเธรดหนึ่งกำลังรอให้เธรดอื่นเสร็จสิ้น หากเกิดเงื่อนไขนี้ขึ้น เราสามารถใช้ Thread.join() โดยใช้เวลาสูงสุดในการดำเนินการ

ตัวอย่าง

<ก่อน> DeadlockTest คลาสสาธารณะ { โมฆะสาธารณะหลัก (สตริง [] args) พ่น InterruptedException { วัตถุ obj1 =วัตถุใหม่ (); วัตถุ obj2 =วัตถุใหม่ (); วัตถุ obj3 =วัตถุใหม่ (); เธรด t1 =เธรดใหม่ (ใหม่ SyncThread (obj1, obj2), "t1"); เธรด t2 =เธรดใหม่ (ใหม่ SyncThread (obj2, obj3), "t2"); t1.start(); เธรด. สลีป (2000); t2.start(); เธรด. สลีป (2000); }} คลาส SyncThread ใช้ Runnable { วัตถุส่วนตัว obj1; วัตถุส่วนตัว obj2; SyncThread สาธารณะ (วัตถุ o1, วัตถุ o2) { this.obj1=o1; this.obj2=o2; } @Override การรันโมฆะสาธารณะ () { ชื่อสตริง =Thread.currentThread ().getName (); System.out.println (ชื่อ + " กำลังรับการล็อกบน " + obj1); ซิงโครไนซ์ (obj1) { System.out.println (ชื่อ + " ได้ล็อคบน " + obj1); งาน(); } System.out.println (ชื่อ + " ปลดล็อกบน " + obj1); System.out.println (ชื่อ + " กำลังรับการล็อกบน " + obj2); ซิงโครไนซ์ (obj2) { System.out.println (ชื่อ + " ได้รับล็อคบน " + obj2); งาน(); } System.out.println (ชื่อ + " ปลดล็อกบน " + obj2); System.out.println(ชื่อ + "ดำเนินการเสร็จสิ้น"); } งานโมฆะส่วนตัว () { ลอง { Thread.sleep (5000); } จับ (InterruptedException เช่น) { ie.printStackTrace (); } }}

ผลลัพธ์

t1 กำลังรับการล็อกบน java.lang.Object@917d8d4t1 ล็อกที่ได้รับบน java.lang.Object@917d8d4t2 กำลังรับการล็อกบน java.lang.Object@5c4b42fbt2 ล็อกที่ได้รับบน java.lang.Object@5c4b42fbt1 ปลดล็อกบน java.lang .Object@917d8d4t1 กำลังได้รับล็อกบน java.lang.Object@5c4b42fbt1 ล็อกที่ได้รับบน java.lang.Object@5c4b42fbt2 ปลดล็อกบน java.lang.Object@5c4b42fbt2 เพื่อรับการล็อกบน java.lang.Object@528cb702tva ที่ได้รับ .Object@528cb702t1 ปลดล็อคบน java.lang.Object@5c4b42fbt2 ปลดล็อคบน java.lang.Object@528cb702t1 เสร็จสิ้น Execution.t2 เสร็จสิ้นการดำเนินการ