在C#中,线程安全的编程是确保多线程环境下代码的正确性和可靠性的重要考虑因素。
// 使用锁保护共享资源的示例代码
private static readonly object lockObject = new object();
private static int sharedVariable = 0;
public void IncrementSharedVariable()
{
lock (lockObject)
{
sharedVariable++;
}
}
在上面的示例中,我们使用lock关键字创建了一个临界区域,确保了在任何给定时间只有一个线程可以访问和修改sharedVariable变量。这样可以避免多个线程同时修改该变量而导致的竞态条件(Race Condition)。
// 使用互斥量保护共享资源的示例代码
private static Mutex mutex = new Mutex();
private static int sharedVariable = 0;
public void IncrementSharedVariable()
{
mutex.WaitOne();
try
{
sharedVariable++;
}
finally
{
mutex.ReleaseMutex();
}
}
在上面的示例中,我们使用Mutex类创建了一个互斥量,确保了在任何给定时间只有一个线程可以访问和修改sharedVariable变量。通过调用WaitOne方法获取互斥量的所有权,并在操作完成后调用ReleaseMutex方法释放互斥量。
// 使用Monitor保护共享资源的示例代码
private static object lockObject = new object();
private static int sharedVariable = 0;
public void IncrementSharedVariable()
{
Monitor.Enter(lockObject);
try
{
sharedVariable++;
}
finally
{
Monitor.Exit(lockObject);
}
}
在上面的示例中,我们使用Monitor类创建了一个临界区域,确保了在任何给定时间只有一个线程可以访问和修改sharedVariable变量。通过调用Enter方法进入临界区域,并在操作完成后调用Exit方法离开临界区域。
// 使用并发集合进行线程安全的集合操作示例代码
private static ConcurrentDictionary<string, int> dictionary = new ConcurrentDictionary<string, int>();
public void AddOrUpdateDictionary(string key, int value)
{
dictionary.AddOrUpdate(key, value, (k, oldValue) => oldValue + value);
}
在上面的示例中,我们使用ConcurrentDictionary来管理一个线程安全的字典。通过调用AddOrUpdate方法,可以在多个线程同时向字典中添加或更新键值对,而不会导致竞态条件。
// 使用线程安全的类型示例代码
private static ThreadLocal<Random> randomGenerator = new ThreadLocal<Random>(() => new Random());
public int GenerateRandomNumber()
{
return randomGenerator.Value.Next();
}
在上面的示例中,我们使用ThreadLocal<T>来创建一个线程本地的Random对象,确保每个线程都有自己的随机数生成器,避免了多个线程同时访问同一个随机数生成器而导致的竞态条件。