C# 中的 synchronized
关键字主要用于确保在同一时刻只有一个线程可以访问共享资源。它适用于以下场景:
- 多线程访问共享资源:当多个线程需要同时访问和修改同一资源时,为了避免数据不一致和竞争条件,可以使用
synchronized
关键字来确保资源的线程安全。
public class SharedResource { private int counter = 0; public synchronized void Increment() { counter++; } public synchronized int GetCounter() { return counter; } }
- 方法级别的同步:如果你希望确保某个方法在同一时刻只能被一个线程访问,可以在方法声明上添加
synchronized
关键字。
public class MyClass { public synchronized void MySynchronizedMethod() { // 同步代码 } }
- 保护临界区代码:在多线程环境中,临界区是指同一时刻只能被一个线程执行的代码段。使用
synchronized
关键字可以确保在同一时刻只有一个线程执行临界区代码。
public class CriticalSectionExample { private object lockObject = new object(); public void CriticalSectionMethod() { lock (lockObject) { // 临界区代码 } } }
- 实现线程安全的集合:C# 中的某些集合类(如
Hashtable
、Queue
等)是非线程安全的。如果需要在多线程环境中使用这些集合,可以使用synchronized
关键字来确保线程安全。
public class ThreadSafeCollection{ private readonly Queue _queue = new Queue (); public void Enqueue(T item) { lock (_queue) { _queue.Enqueue(item); } } public T Dequeue() { lock (_queue) { if (_queue.Count == 0) return default(T); var item = _queue.Dequeue(); return item; } } }
需要注意的是,过度使用 synchronized
关键字可能会导致性能下降,因为它会限制多个线程同时执行。在实际应用中,可以根据具体需求选择合适的同步机制,如 lock
语句、Monitor
类、SemaphoreSlim
类等。