スレッドセーフな処理(Monitorクラス)
プログラミングC# p520
同じ処理をMonitorを使ってやってみる。
using System; using System.Threading; class ThreadTest { private static int zandaka = 1000000; private static Object lockObj = new Object(); static void Main(string[] args) { ThreadStart ts1 = new ThreadStart(delegate(){ try { Monitor.Enter(lockObj); int currentZandaka = zandaka; // 残高を使ったチェックなどの処理 Thread.Sleep(100); // 残高を減額(引き出し) zandaka = currentZandaka - 200000; } finally { Monitor.Exit(lockObj); } }); ThreadStart ts2 = new ThreadStart(delegate(){ try { Monitor.Enter(lockObj); int currentZandaka = zandaka; // 残高を使ったチェックなどの処理 Thread.Sleep(100); // 残高を増額(預け入れ) zandaka = currentZandaka + 300000; } finally { Monitor.Exit(lockObj); } }); Thread t1 = new Thread(ts1); Thread t2 = new Thread(ts2); t1.Start(); t2.Start(); t1.Join(); t2.Join(); Console.WriteLine("zandaka = {0}", zandaka); } }
結果はこう。
zandaka = 1100000
やっぱり問題なし。