ภาพรวม
อาร์เรย์ใน C# มีคุณสมบัติ SyncRoot (มาจาก ICollection) ใช้ร่วมกับ lock เพื่อให้การเข้าถึงอาร์เรย์เป็น thread-safe
ตัวอย่างที่ 1: อาร์เรย์จำนวนเต็ม
using System;
public class Demo
{
public static void Main()
{
Array intArr = new int[] { 5, 10, 15, 20, 25, 30, 35, 40 };
Console.WriteLine("Integer array...");
foreach (int i in intArr)
Console.WriteLine(i);
Console.WriteLine("After applying lock on array...");
lock (intArr.SyncRoot)
{
foreach (Object ob in intArr)
Console.WriteLine(ob);
}
}
}
ผลลัพธ์
Integer array... 5 10 15 20 25 30 35 40 After applying lock on array... 5 10 15 20 25 30 35 40
ตัวอย่างที่ 2: อาร์เรย์สตริง
using System;
public class Demo
{
public static void Main()
{
Array strArr = new String[] { "Harry", "Tom", "Kevin", "Ryan", "Katie", "Amy" };
Console.WriteLine("String array...");
foreach (string i in strArr)
Console.WriteLine(i);
Console.WriteLine("After applying lock on array...");
lock (strArr.SyncRoot)
{
foreach (Object ob in strArr)
Console.WriteLine(ob);
}
}
}
ผลลัพธ์
String array... Harry Tom Kevin Ryan Katie Amy After applying lock on array... Harry Tom Kevin Ryan Katie Amy
สรุป
- ทุกอาร์เรย์มี
SyncRootใช้กับlockได้เลย - การล็อกเฉพาะช่วงที่อ่าน/เขียนจริง ไม่ควรล็อกนานเกินไป
- สำหรับสถานการณ์ซับซ้อน ควรใช้
ConcurrentBagหรือConcurrentQueueแทน