ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

スレッドセーフな処理(lockキーワード)

プログラミングC# p519

同じ処理をlockを使ってやってみる。

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(){
                        lock(lockObj)
                        {
                                int currentZandaka = zandaka;

                                // 残高を使ったチェックなどの処理
                                Thread.Sleep(100);

                                // 残高を減額(引き出し)
                                zandaka = currentZandaka - 200000;
                        }
                });
                ThreadStart ts2 = new ThreadStart(delegate(){
                        lock(lockObj)
                        {
                                int currentZandaka = zandaka;

                                // 残高を使ったチェックなどの処理
                                Thread.Sleep(100);

                                // 残高を増額(預け入れ)
                                zandaka = currentZandaka + 300000;
                        }
                });

                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

というわけで問題なく出来てます。