同步锁
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; } }