您的位置:首页 > 其它

同步锁

2015-06-26 13:22 309 查看
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;

}
}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: