กล่าวอีกนัยหนึ่งเธรดการใช้งานซิงเกิลนี้ปลอดภัยหรือไม่:
public class Singleton
{
private static Singleton instance;
private Singleton() { }
static Singleton()
{
instance = new Singleton();
}
public static Singleton Instance
{
get { return instance; }
}
}
X
สิ้นสุดลงด้วยการได้โดยไม่ต้องเกลียว-1
ไม่ใช่ปัญหาความปลอดภัยของเธรด แต่เครื่องมือเริ่มต้นx = -1
จะรันก่อน (อยู่ในบรรทัดก่อนหน้าในรหัสซึ่งเป็นหมายเลขบรรทัดล่าง) แล้วการเริ่มต้นX = GetX()
การทำงานซึ่งจะทำให้บนกรณีเท่ากับX
-1
จากนั้นตัวสร้างแบบคงที่ "ชัดเจน" จะเป็นตัวเริ่มต้นของประเภทstatic C() { ... }
ซึ่งจะเปลี่ยนเป็นตัวพิมพ์เล็กx
เท่านั้น ดังนั้นหลังจากนั้นMain
วิธีการ (หรือOther
วิธีการ) สามารถไปและอ่านตัวพิมพ์X
ใหญ่ ค่าของมันจะเป็นเท่า-1
กันแม้จะมีเพียงหนึ่งเธรด
Instance
พร้อมกัน หนึ่งในเธรดจะถูกบอกให้เรียกใช้ประเภทการเริ่มต้นครั้งแรก (หรือที่เรียกว่าตัวสร้างแบบคงที่) ในขณะเดียวกันเธรดอื่น ๆ ที่ต้องการอ่านInstance
คุณสมบัติจะถูกล็อกจนกว่าตัวเตรียมข้อมูลเบื้องต้นชนิดจะเสร็จสิ้น เฉพาะหลังจากที่ initializer ฟิลด์ได้ข้อสรุปแล้วเธรดจะได้รับอนุญาตให้รับInstance
ค่า ดังนั้นไม่มีใครสามารถเห็นInstance
ความเป็นnull
อยู่