ขั้นแรก ให้ใช้โหมดซิงเกิลตันในโหมดออกแบบเพื่อป้องกันการเริ่มต้นออบเจ็กต์หลายรายการ ทำให้เกิดความไม่สอดคล้องกันในพื้นที่การเข้าถึง
ควรเพิ่มล็อคที่จุดนับเพื่อปิดกั้นการนับเธรดอื่นชั่วคราวเพื่อให้มั่นใจในความแม่นยำของการนับ
หากคุณต้องการนับและส่งออกแบบเรียลไทม์ คุณสามารถล็อกการนับและเอาต์พุตพร้อมกันได้ มิฉะนั้น ผลลัพธ์การนับและเอาต์พุตของเธรดที่แตกต่างกันอาจไม่ได้รับการประมวลผลตามลำดับ
การล็อคด้วยวิธีนี้สามารถรับประกันการประมวลผลตามลำดับและเอาต์พุตตามลำดับ แต่จะทำให้ประสิทธิภาพบางส่วนลดลง
ตำแหน่งล็อคในรหัสมีความสำคัญมาก
โปรแกรมนี้จะเพิ่มการดำเนินการ 3 รายการ เหตุผลก็คือ เธรดนี้ยังไม่ถึง 200 ครั้ง แต่จะต้องมีการเพิ่มเธรดในครั้งแรก ดังนั้น ให้ตัดสินในการเพิ่ม
คัดลอกรหัสรหัสดังต่อไปนี้:
CommonSigleton MyCounter =CommonSigleton.Instance;
/// <สรุป>
///งานด้าย
/// </สรุป>
โมฆะสาธารณะ DoSomeWork()
-
/// สร้างสตริงการแสดงผล
ผลลัพธ์สตริง = "";
/// สร้างอินสแตนซ์ Sigleton
System.Threading.Thread.Sleep (100);
int i = 0;
ในขณะที่ (MyCounter.GetCounter() < 200)
-
// ตรวจสอบให้แน่ใจว่าการนับสอดคล้องกับเอาต์พุต แม้ว่าจะมีการเพิ่มช่วงเวลาระหว่างการนับและเอาต์พุต พื้นที่นี้จะถูกล็อคเพื่อป้องกันไม่ให้เธรดอื่นทำงาน
ล็อค(นี้)
-
///เริ่มนับ
MyCounter.Add();
System.Threading.Thread.Sleep (100);
เธรดเธรด = Thread.CurrentThread;
ผลลัพธ์ += "เธรด";
ผลลัพธ์ += i++.ToString() + "――〉" + thread.Name + " ";
ผลลัพธ์ += "จำนวนปัจจุบัน:";
ผลลัพธ์ += MyCounter.GetCounter().ToString();
ผลลัพธ์ += "/n";
Console.WriteLine (ผลลัพธ์);
// ล้างสตริงการแสดงผล
ผลลัพธ์ = "";
-
-
-
โมฆะสาธารณะ StartMain()
-
เธรด thread0 = Thread.CurrentThread;
thread0.Name = "เธรด 0";
เธรด thread1 = เธรดใหม่ (ThreadStart ใหม่ (DoSomeWork));
thread1.Name = "เธรด 1";
เธรด thread2 = เธรดใหม่ (ThreadStart ใหม่ (DoSomeWork));
thread2.Name = "เธรด 2";
เธรด thread3 = เธรดใหม่ (ThreadStart ใหม่ (DoSomeWork));
thread3.Name = "เธรด 3";
thread1.Start();
thread2.Start();
thread3.Start();
/// เธรด 0 ทำงานเหมือนกับเธรดอื่นเท่านั้น
ทำบางอย่าง();
-
-