C#的 lock 类似 Java 的 synchronized,以引用类型作为同步锁,不多说了,上代码
public class LockAndMonitor {
private readonly object _locker = new object();
private readonly List<string> _data = new List<string>();
public void AddData(string item) {
lock(_locker) {
_data.Add(item);
}
}
public string[] GetData() {
lock(_locker) {
//返回数据副本,返回引用将导致外部可以修改数据
return _data.ToArray();
}
}
//使用 Monitor 实现类似 lock 的同步代码块
public void AddDataByMonitor(string item) {
bool isLockTaken = false;
var temp = _locker;
try {
Monitor.Enter(temp, ref isLockTaken);
{
_data.Add(item);
}
} finally {
if(isLockTaken) {
Monitor.Exit(temp);
}
}
}
//实现一个线程安全的队列(仅供参考,C#内置有线程安全的队列类型)
public class MessageQueue<T> {
private readonly object _locker = new object();
private readonly Queue<T> _queue = new Queue<T>();
public void Post(T message) {
lock(_locker) {
bool isEmpty = _queue.Count == 0;
_queue.Enqueue(message);
//队列为空,说明有其他线程在等待
if(isEmpty) {
//唤醒等待的线程
Monitor.Pulse(_locker);
}
}
}
public T Get() {
lock(_locker) {
while(_queue.Count == 0) {
Monitor.Wait(_locker);
}
return _queue.Dequeue();
}
}
}
}