什么是线程安全?C#中如何实现线程安全?

锁(Lock):

使用lock关键字可以确保在同一时刻只有一个线程可以访问被锁定的代码块。

private static readonly object _lock = new object();

public void ThreadSafeMethod()

{

lock (_lock)

{

// 临界区代码

}

}

Monitor类:

Monitor类提供了更细粒度的控制,可以用于实现等待和通知机制。

private static readonly object _lock = new object();

private static bool _condition = false;

public void ThreadSafeMethod()

{

lock (_lock)

{

while (!_condition)

{

Monitor.Wait(_lock);

}

// 条件满足时执行的代码

}

}

public void SignalMethod()

{

lock (_lock)

{

_condition = true;

Monitor.Pulse(_lock);

}

}

WaitHandle类及其子类:

AutoResetEvent、ManualResetEvent、CountdownEvent等类用于线程间的同步。

private ManualResetEvent _resetEvent = new ManualResetEvent(false);

public void ThreadMethod()

{

_resetEvent.WaitOne();

// 线程被唤醒后执行的代码

}

public void SignalMethod()

{

_resetEvent.Set(); // 唤醒一个正在等待的线程

}

Interlocked类:

Interlocked类提供了原子操作,确保对共享变量的读写操作是线程安全的。

private static int _counter = 0;

public void IncrementCounter()

{

Interlocked.Increment(ref _counter);

}

Volatile关键字:

volatile关键字用于指示某个字段不应该被编译器优化,以确保线程能够看到最新的值。

private static volatile bool _flag = false;

public void SetFlag()

{

_flag = true;

}

public void CheckFlag()

{

if (_flag)

{

// 执行相关操作

}

}

使用线程安全的集合类:

.NET提供了多种线程安全的集合类,如ConcurrentDictionary、ConcurrentQueue、ConcurrentStack等。

private ConcurrentDictionary _concurrentDictionary = new ConcurrentDictionary();

public void AddToDictionary(int key, string value)

{

_concurrentDictionary.TryAdd(key, value);

}

public string GetFromDictionary(int key)

{

if (_concurrentDictionary.TryGetValue(key, out string value))

{

return value;

}

return null;

}

使用Mutex和Semaphore:

Mutex用于确保同一时间只有一个线程可以访问共享资源。

Semaphore用于限制同时访问共享资源的线程数量。

private static Mutex _mutex = new Mutex();

public void ThreadSafeMethod()

{

_mutex.WaitOne();

try

{

// 临界区代码

}

finally

{

_mutex.ReleaseMutex();

}

}

private static Semaphore _semaphore = new Semaphore(2, 2); // 允许最多2个线程

public void ThreadSafeMethod()

{

_semaphore.WaitOne();

try

{

// 临界区代码

}

finally

{

_semaphore.Release();

}

}

使用Task和async/await:

使用Task和异步编程模型(async/await)可以更好地管理并发操作,减少线程阻塞。

public async Task ThreadSafeMethodAsync()

{

await Task.Run(() =>

{

// 异步任务代码

});

}

冒烟测试怎么做|2025年神鬼传奇手游新区开放了吗?新区活动有哪些?