.net Lock(this),Lock(obj),Lock("string") console app demo,线程安全

来源:互联网 发布:csgo游戏优化 编辑:程序博客网 时间:2024/06/07 06:18
 class Program
    {
        static object obj = new object();
        static int balance = 500;
        static void Main(string[] args)
        {
            //todo with lock,Safe thread
            //Thread t1 = new Thread(new ThreadStart(Credit));
            //t1.Start();


            //Thread t2 = new Thread(() => Debit());
            //t2.Start();


            //todo without lock,thread not safty
            //Thread t1 = new Thread(new ThreadStart(CreditNoLock));
            //t1.Start();


            //Thread t2 = new Thread(() => DebitNoLock());
            //t2.Start();


            //todo new instance,lock (this---context),Lock Failed
            //var account = new Account();
            //Thread t1 = new Thread(new ThreadStart(account.Credit));
            //t1.Start();


            //var account2 = new Account();
            //Thread t2 = new Thread(() => account2.Debit());
            //t2.Start();


            //todo new instance,lock (obj-syncRoot),Lock Successed
            var account = new Account();
            Thread t1 = new Thread(new ThreadStart(account.CreditLockObj));
            t1.Start();


            var account2 = new Account();
            Thread t2 = new Thread(() => account2.DebitLockObj());
            t2.Start();


            //todo 结论!!  lock(this)只对当前instance有效,lock(obj)安全,lock("string字符串")无意义




            Console.ReadKey();
        }


        static void Credit()
        {
            lock (obj)
            {
                for (int i = 0; i < 15; i++)
                {
                    Thread.Sleep(500);
                    balance += 100;
                    Console.WriteLine("After crediting,balance is {0}", balance);
                }
            }
        }


        private static void Debit()
        {
            lock (obj)
            {
                for (int i = 0; i < 15; i++)
                {
                    Thread.Sleep(500);
                    balance -= 100;
                    Console.WriteLine("After debiting,balance is {0}", balance);
                }
            }
        }




        static void CreditNoLock()
        {
            for (int i = 0; i < 15; i++)
            {
                Thread.Sleep(1000);
                balance += 100;
                Console.WriteLine("After crediting,balance is {0}", balance);
            }
        }


        private static void DebitNoLock()
        {
            for (int i = 0; i < 15; i++)
            {
                Thread.Sleep(1000);
                balance -= 100;
                Console.WriteLine("After debiting,balance is {0}", balance);
            }
        }
    }




    public class Account
    {
        static int balance = 500;
        static object obj = new object();
        public void Credit()
        {
            lock (this)
            {
                for (int i = 0; i < 5; i++)
                {
                    Thread.Sleep(1000);
                    balance -= 100;
                    Console.WriteLine("After debiting,balance is {0}", balance);
                }
            }
        }


        public void Debit()
        {
            lock (this)
            {
                for (int i = 0; i < 5; i++)
                {
                    Thread.Sleep(1000);
                    balance += 100;
                    Console.WriteLine("After debiting,balance is {0}", balance);
                }
            }
        }




        public void CreditLockObj()
        {
            lock (obj)
            {
                for (int i = 0; i < 5; i++)
                {


                    Thread.Sleep(1000);
                    balance -= 100;
                    Console.WriteLine("After debiting,balance is {0}", balance);
                }
            }
        }


        public void DebitLockObj()
        {
            lock (obj)
            {
                for (int i = 0; i < 5; i++)
                {
                    Thread.Sleep(1000);
                    balance += 100;
                    Console.WriteLine("After debiting,balance is {0}", balance);
                }
            }
        }

    }



0 0
原创粉丝点击