ไม่ไม่ตราบเท่าที่คุณกำลังล็อกวัตถุเดียวกัน รหัสเรียกซ้ำมีประสิทธิภาพอยู่แล้วและสามารถดำเนินการต่อได้โดยไม่ จำกัด
lock(object) {...}
เป็นชวเลขสำหรับการใช้คลาสMonitor ดังที่Marc ชี้ให้เห็นว่าMonitor
อนุญาตให้กลับเข้ามาใหม่ได้ดังนั้นความพยายามซ้ำ ๆ เพื่อล็อควัตถุที่เธรดปัจจุบันมีการล็อกอยู่แล้วจะใช้ได้ดี
หากคุณเริ่มต้นในการล็อคที่แตกต่างกันวัตถุที่เมื่อคุณจะต้องระมัดระวัง ให้ความสนใจเป็นพิเศษกับ:
- รับการล็อกบนวัตถุจำนวนหนึ่งในลำดับเดียวกันเสมอ
- ปลดล็อคในลำดับย้อนกลับเสมอว่าคุณได้มาอย่างไร
ถ้าคุณทำลายทั้งกฎเหล่านี้คุณสวยรับประกันมากที่จะได้รับปัญหาการหยุดชะงักในบางจุด
นี่คือหนึ่งหน้าเว็บที่ดีที่อธิบายการซิงโครไนซ์เธรดใน. NET: http://dotnetdebug.net/2005/07/20/monitor-class-avoiding-deadlocks/
นอกจากนี้ให้ล็อควัตถุให้ได้ครั้งละน้อยที่สุด พิจารณาใช้ตัวล็อคแบบหยาบถ้าเป็นไปได้ แนวคิดที่ว่าถ้าคุณสามารถเขียนโค้ดของคุณเพื่อให้มีกราฟวัตถุและคุณสามารถรับการล็อกบนรากของกราฟวัตถุนั้นได้ให้ทำเช่นนั้น ซึ่งหมายความว่าคุณมีหนึ่งล็อคบนวัตถุรากนั้นดังนั้นจึงไม่ต้องกังวลมากเกี่ยวกับลำดับที่คุณได้รับ / ปลดล็อค
(หมายเหตุเพิ่มเติมอีกประการหนึ่งตัวอย่างของคุณไม่ได้เกิดซ้ำในทางเทคนิคหากต้องการเรียกซ้ำBar()
จะต้องเรียกตัวเองโดยทั่วไปเป็นส่วนหนึ่งของการวนซ้ำ)