同步锁
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; } }
相关文章推荐
- jquery.validata1.11怎么支持metadata
- Apply a theme to an Activity or application
- [Leetcode]-Reverse Bits
- locale命令设置语言环境
- [Erlang]Erlang常用工具讲解
- 用itext生成pdf报表下篇(解决中文问题)
- android 开发点滴
- Android studio构建类似Eclipse的文件目录结构
- Spring MVC —— 字符过滤器
- Weblogic集群HTTP会话复制失败故障诊断
- C++ 零散知识点速记 -- <深入探索C++对象模型> 读书笔记
- js中定义用字符串拼接起来的变量名的变量
- XCTest的waitForExpectationsWithTimeout 方法
- 使用ShareSDK无法微信分享的解决方法,sharesdk分享
- 激动是魔鬼
- 学习DNS路上之CloudXNS
- android 一个TextView中显示不同颜色的字体
- 项目优化经验分享(两)自己主动查询
- svn: 命令行上传多个指定文件
- 检索COM类工厂中的CLSID为{}组件失败,错误: 80040154的解决方法