คุณสมบัติ Array.SyncRoot ใน C#
Array.SyncRoot คืนค่าอ็อบเจกต์ที่ใช้สำหรับซิงโครไนซ์การเข้าถึงอาร์เรย์ (Synchronization) ใช้ร่วมกับคำสั่ง lock เพื่อป้องกัน Race Condition เมื่อหลายเธรดเข้าถึงอาร์เรย์พร้อมกัน
ตัวอย่างการใช้งาน
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
Array arr = new int[] { 23, 11, 32, 18, 87 };
// Lock ผ่าน SyncRoot ก่อนวนลูป
lock (arr.SyncRoot)
{
foreach (object val in arr)
Console.WriteLine(val);
}
}
}
ผลลัพธ์
23
11
32
18
87
รายละเอียดสำคัญ
SyncRootเป็นการ Implement ของ InterfaceICollection- การ Enumerate (foreach) บนคอลเลกชัน ไม่ใช่ Thread-safe แม้คอลเลกชันจะ Synchronized แล้ว
- ต้องใช้
lock(arr.SyncRoot)ครอบการ Enumerate ทุกครั้ง - ใน .NET Core / .NET 5+ แนะนำให้ใช้
Immutable CollectionsหรือConcurrent Collections(System.Collections.Concurrent) แทน
โค้ดแบบเต็มรูปแบบ
lock (arr.SyncRoot)
{
foreach (var item in arr)
{
// Process item safely
}
}