標籤:enter 阻塞 color err stat hashtable new oid sync
class Program { private static ReaderWriterLockSlim _LockSlim = new ReaderWriterLockSlim(); private static Hashtable list = Hashtable.Synchronized(new Hashtable()); static void Main(string[] args) { new Thread(new ParameterizedThreadStart(delegate(object obj) { Write(0, 10000); })).Start(); Thread.Sleep(1000); new Thread(new ParameterizedThreadStart(delegate(object obj) { Read(1, 1000); })).Start(); new Thread(new ParameterizedThreadStart(delegate(object obj) { Read(2, 1000); })).Start(); new Thread(new ParameterizedThreadStart(delegate(object obj) { Read(3, 1000); })).Start(); new Thread(new ParameterizedThreadStart(delegate(object obj) { Read(4, 1000); })).Start(); Console.ReadKey(); } /// <summary> /// 對於i相同的線程進行阻塞保證不會並行多個 /// </summary> /// <param name="i"></param> /// <param name="j"></param> public static void Read(int i,int j) { Console.WriteLine(DateTime.Now.ToString() + "\t線程" + i.ToString() + "即將進入讀取狀態"); _LockSlim.EnterReadLock(); Console.WriteLine(DateTime.Now.ToString() + "\t線程" + i.ToString() + "進入讀取狀態"); Thread.Sleep(j); _LockSlim.ExitReadLock(); Console.WriteLine(DateTime.Now.ToString() + "\t線程" + i.ToString() + "退出讀取狀態"); } public static void Write(int i, int j) { Console.WriteLine(DateTime.Now.ToString() + "\t線程" + i.ToString() + "即將進入寫入狀態"); _LockSlim.EnterWriteLock(); Console.WriteLine(DateTime.Now.ToString() + "\t線程" + i.ToString() + "進入寫入狀態"); Thread.Sleep(j); _LockSlim.ExitWriteLock(); Console.WriteLine(DateTime.Now.ToString() + "\t線程" + i.ToString() + "退出寫入狀態"); } }
輸出:
2017/2/20 17:51:55 線程0即將進入寫入狀態2017/2/20 17:51:55 線程0進入寫入狀態2017/2/20 17:51:56 線程1即將進入讀取狀態2017/2/20 17:51:56 線程2即將進入讀取狀態2017/2/20 17:51:56 線程3即將進入讀取狀態2017/2/20 17:51:56 線程4即將進入讀取狀態2017/2/20 17:52:05 線程1進入讀取狀態2017/2/20 17:52:05 線程4進入讀取狀態2017/2/20 17:52:05 線程0退出寫入狀態2017/2/20 17:52:05 線程2進入讀取狀態2017/2/20 17:52:05 線程3進入讀取狀態2017/2/20 17:52:06 線程2退出讀取狀態2017/2/20 17:52:06 線程1退出讀取狀態2017/2/20 17:52:06 線程4退出讀取狀態2017/2/20 17:52:06 線程3退出讀取狀態
c# 多線程 讀寫分離