同步锁

 class Program
    {
        static void Main(string[] args)
        {
            //控制台默认输出行数是300,可以设置
            Console.BufferHeight = 1000;

            TicketSeller t1 = new TicketSeller("A");
            TicketSeller t2 = new TicketSeller("B");
           
            Console.ReadLine();
        }

    }


    public class TicketSeller
    {
        public static int count = 500;
        public static object locker = new object();

        public TicketSeller(string name)
        {
            Console.WriteLine(count);
            Thread th = new Thread(Sell);
            th.Name = name;
            th.IsBackground = true;
            th.Start();
            Console.WriteLine(count);
        }

        public void Sell()
        {

            while (count > 0)
            {
                //引用类型对象在内存中分配的对象头空间(栈空间)最后2bit存放锁标识;lock只要是静态变量就可以,this.GetType()
                lock (locker)
                {
                    TicketSeller.count--;
                    Console.WriteLine(System.Threading.Thread.CurrentThread.Name + "剩余{0}", count);
                }

            }
        }
    }
或者使用Monitor

bool isGetLocker = false;
                try
                {
                    //引用类型对象在内存中分配的对象头空间(栈空间)最后2bit存放锁标识
                    Monitor.Enter(locker, ref isGetLocker);
                    TicketSeller.count--;
                    Console.WriteLine(System.Threading.Thread.CurrentThread.Name + "剩余{0}", count);

                }
                catch (Exception e)
                {

                    throw e;
                }
                finally
                {
                    if (isGetLocker)
                    {
                        Monitor.Exit(locker);
                    }
                }
或者给方法标记特性
 [MethodImpl(MethodImplOptions.Synchronized)]

线程安全单例模式
  class SingleTest
    {
        private static SingleTest s = null;
        private SingleTest() { }

        static SingleTest GetSingle()
        {
            //this,type
            lock (typeof(SingleTest))
            {
                if (s == null)
                { s = new SingleTest(); }
            }
            return s;

        }
    }

 



posted @ 2015-06-26 13:22  nbu_djw  阅读(249)  评论(0编辑  收藏  举报