ReaderWriterLockSlim
使用读写锁来保护多线程共同访问的静态变量。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ReaderWriterlocks
{
class Program
{
static ReaderWriterLockSlim readerWriterLockSlim = new ReaderWriterLockSlim();
// a static variable that's shared among threads, so we need to use read write lock to make sure the data is not messed up
static Dictionary<int, string> persons = new Dictionary<int, string>();
static Random random = new Random();
static void Main(string[] args)
{
var task1 = Task.Factory.StartNew(Read);
var task2 = Task.Factory.StartNew(Write, "raymond");
var task3 = Task.Factory.StartNew(Write, "msft");
var task4 = Task.Factory.StartNew(Read);
var task5 = Task.Factory.StartNew(Read);
Task.WaitAll(task1, task2, task3, task4, task5);
Console.Read();
}
static void Read()
{
for (int i = 0; i < 10; i++)
{
readerWriterLockSlim.EnterReadLock(); // read lock
Thread.Sleep(50);
readerWriterLockSlim.ExitReadLock();
}
}
static void Write(object user)
{
for (int i = 0; i < 10; i++)
{
int id = GetRandom();
readerWriterLockSlim.EnterWriteLock(); // write lock
var person = "Person " + i;
persons.Add(id, person);
readerWriterLockSlim.ExitWriteLock();
Console.WriteLine(user + " added " + person);
Thread.Sleep(250);
}
}
static int GetRandom()
{
lock (random)
{
return random.Next(2000, 5000);
}
}
}
}
第二个例子
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace AcquireWriterLockDemo
{
class Program
{
static ReaderWriterLock rwlock = new ReaderWriterLock();
static void Main(string[] args)
{
//比如开启5个task
for (int i = 0; i < 5; i++)+
{
Task.Factory.StartNew(() =>
{
Read();
});
}
Task.Factory.StartNew(() =>
{
Write();
});
Console.Read();
}
static int nums = 0;
/// <summary>
/// 线程读
/// </summary>
static void Read()
{
while (true)
{
Thread.Sleep(10);
//获得锁
rwlock.AcquireReaderLock(int.MaxValue);
Thread.Sleep(10);
Console.WriteLine("当前 t={0} 进行读取 {1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now);
rwlock.ReleaseReaderLock();
}
}
/// <summary>
/// 线程写
/// </summary>
static void Write()
{
while (true)
{
//3s进行一次写操作
Thread.Sleep(3000);
rwlock.AcquireWriterLock(int.MaxValue);
Thread.Sleep(30000);
Console.WriteLine("当前 t={0} 进行写入。。。。。。。。。。。。。。。。。。。。。。。{1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now);
rwlock.ReleaseWriterLock();
}
}
}
}