การหยุดชะงัก
สกรูเป็นเครื่องมือที่มีประโยชน์มากที่มีแอพพลิเคชั่นมากมายเพราะใช้งานง่ายและเข้าใจง่าย แต่ในเวลาเดียวกันมันก็จะนำปัญหาบางอย่างนั่นคือมันอาจทำให้เกิดการหยุดชะงัก เมื่อมีการหยุดชะงักเกิดขึ้นฟังก์ชั่นระบบจะไม่สามารถใช้งานได้ ก่อนอื่นลองดูที่รหัสชิ้นหนึ่งซึ่งจะทำให้เกิด deadlocks ทำให้เธรดเธรด _1 และเธรดเธรด _2 รอซึ่งกันและกันเพื่อปล่อยล็อค
แพ็คเกจเธรด; คลาสสาธารณะ deadlockdemo {สตริงคงที่ส่วนตัว a = "a"; สตริงคงที่ส่วนตัว b = "b"; โมฆะคงที่สาธารณะหลัก (สตริง args []) {ใหม่ deadlockdemo (). deadlock ();} โมฆะส่วนตัว Deadlock () {// ด้ายด้ายด้าย {system.err.println ("-thread_1 ล็อค a ----"); ซิงโครไนซ์ (b) {system.err.println ("-thread_1 ล็อค b ----");}}}}); // Thread_2 Thread_2 = เธรดใหม่ {system.out.println ("-thread_2 ล็อค b -----"); ซิงโครไนซ์ (a) {system.out.println ("-thread_2 ล็อค a ----");}}}}); thread_1.start (); thread_2.start ();รหัสนี้เป็นเพียงการสาธิตสถานการณ์การหยุดชะงักและในความเป็นจริงคุณอาจไม่ได้เขียนรหัสดังกล่าว แต่ในสถานการณ์ที่ซับซ้อนมากขึ้นคุณอาจพบปัญหาดังกล่าวเช่น Thread_1 ไม่ได้ปล่อยสายเคเบิลเนื่องจากสถานการณ์ที่ผิดปกติบางอย่าง (Dead Loop) หรือ Thread_1 ได้รับสายเคเบิลฐานข้อมูลและข้อยกเว้นจะถูกโยนลงเมื่อปล่อยล็อค แต่ไม่ได้เปิดตัว
เมื่อมีการหยุดชะงักเกิดขึ้นธุรกิจก็สามารถรับรู้ได้เนื่องจากไม่สามารถให้บริการได้ จากนั้นคุณสามารถตรวจสอบได้ว่าเธรดใดที่มีปัญหาผ่านเธรดการถ่ายโอนข้อมูล ข้อมูลเธรดต่อไปนี้บอกเราว่าบรรทัดที่ 35 และ 21 ของคลาส Deadlockdemo ทำให้เกิดการหยุดชะงัก
"thread -1" prio = 6 tid = 0x000000000cb13800 nid = 0x19ac รอรายการจอมอนิเตอร์ [0 x000000000d67f000] java.lang.thread.state: บล็อก (บนจอมอนิเตอร์) ที่ thread.deadlockdemo $ 2.Run java.lang.string) - ล็อค <0x00000007D5A9BEB8> (a java.lang.string) ที่ java.lang.thread.run (แหล่งที่ไม่รู้จัก) "เธรด -0" prio = 6 tid = 0x000000000000 java.lang.thread.state: บล็อก (บนจอมอนิเตอร์วัตถุ) ที่ thread.deadlockdemo $ 1.run (deadlockdemo.java:21) - รอล็อค <0x00000007d5a9beb8> (java.lang.string) java.lang.thread.run (แหล่งที่ไม่รู้จัก)
วิธีการทั่วไปหลายวิธีในการหลีกเลี่ยงการหยุดชะงัก
หลีกเลี่ยงการรับล็อคหลายตัวในเวลาเดียวกันกับเธรด
หลีกเลี่ยงเธรดหนึ่งที่ครอบครองทรัพยากรหลายอย่างในเวลาเดียวกันในเชือกและพยายามให้แน่ใจว่าแต่ละเชือกใช้ทรัพยากรเพียงหนึ่งเดียวเท่านั้น
ลองใช้การค้นหาที่กำหนดเวลาโดยใช้ Lock.Trylock (หมดเวลา) แทนที่จะใช้กลไกการค้นหาภายใน
สำหรับสายเคเบิลฐานข้อมูลการล็อคและการปลดล็อคจะต้องอยู่ในการเชื่อมต่อฐานข้อมูลมิฉะนั้นการปลดล็อคจะล้มเหลว
อ้างอิง:
//www.vevb.com/article/131946.htm
//www.vevb.com/article/131943.htm
สรุป
ข้างต้นคือการวิเคราะห์รหัสเต็มวิธีการทั่วไปของ Java เพื่อหลีกเลี่ยงการหยุดชะงักในบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!