当前位置: 首页 > news >正文

网站seo优化皆宣徐州百都网络不错修复WordPress图片上传错误

网站seo优化皆宣徐州百都网络不错,修复WordPress图片上传错误,cmd iis重启单个网站,上海做营销网站哪个公司好C# Lock 解读 一、Lock定义二、简单例子三、简单解释一下执行过程四、Lock的对象选择问题1、为什么不能lock值类型2、Lock字符串3、MSDN推荐的Lock对象4、lock(typeof(Class)) 五、特殊问题#xff1a;Lock#xff08;this#xff09;等的详细解释总结 一、Lock定义 lock 关… C# Lock 解读 一、Lock定义二、简单例子三、简单解释一下执行过程四、Lock的对象选择问题1、为什么不能lock值类型2、Lock字符串3、MSDN推荐的Lock对象4、lock(typeof(Class)) 五、特殊问题Lockthis等的详细解释总结 一、Lock定义 lock 关键字可以用来确保代码块完成运行而不会被其他线程中断。它可以把一段代码定义为互斥段critical section互斥段在一个时刻内只允许一个线程进入执行而其他线程必须等待。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。 在多线程中每个线程都有自己的资源但是代码区是共享的即每个线程都可以执行相同的函数。这可能带来的问题就是几个线程同时执行一个函数导致数据的混乱产生不可预料的结果因此我们必须避免这种情况的发生。 而在.NET中最好了解一下进程、应用域和线程的概念因为Lock是针对线程一级的而在.NET中应用域是否会对Lock起隔离作用我的猜想是即不在同一应用域中的线程无法通过Lock来中断另外也最好能了解一下数据段、代码段、堆、栈等概念。 在C# lock关键字定义如下 lockexpression statement_block其中expression代表你希望跟踪的对象通常是对象引用。 如果你想保护一个类的实例一般地你可以使用this如果你想保护一个静态变量如互斥代码段在一个静态方法内部一般使用类名就可以了。 而statement_block就是互斥段的代码这段代码在一个时刻内只可能被一个线程执行。 二、简单例子 using System; using System.Collections; using System.Collections.Generic; using System.Threading; namespace ConsoleApplication1 {class Program{static void Main(string[] args){Thread thread1 new Thread(new ThreadStart(ThreadStart1));thread1.Name Thread1;Thread thread2 new Thread(new ThreadStart(ThreadStart2));thread2.Name Thread2;Thread thread3 new Thread(new ThreadStart(ThreadStart3));thread3.Name Thread3;thread1.Start();thread2.Start();thread3.Start();Console.ReadKey();}static object _object new object();static void Done(int millisecondsTimeout){Console.WriteLine(string.Format({0} - {1}.Start, DateTime.Now.ToString(HH:mm:ss), Thread.CurrentThread.Name));//下边代码段同一时间只能由一个线程在执行lock (_object){Console.WriteLine(string.Format({0} - {1}进入锁定区域., DateTime.Now.ToString(HH:mm:ss), Thread.CurrentThread.Name));Thread.Sleep(millisecondsTimeout);Console.WriteLine(string.Format({0} - {1}退出锁定区域., DateTime.Now.ToString(HH:mm:ss), Thread.CurrentThread.Name));}}static void ThreadStart1(){Done(5000);}static void ThreadStart2(){Done(3000);}static void ThreadStart2(){Done(1000);}} } 三、简单解释一下执行过程 先来看看执行过程代码示例如下 private static object ojb new object();lock(obj){//锁定运行的代码段}假设线程A先执行线程B稍微慢一点。线程A执行到lock语句判断obj是否已申请了互斥锁判断依据是逐个与已存在的锁进行object.ReferenceEquals比较(此处未加证实)如果不存在则申请一个新的互斥锁这时线程A进入lock里面了。 这时假设线程B启动了而线程A还未执行完lock里面的代码。线程B执行到lock语句检查到obj已经申请了互斥锁于是等待;直到线程A执行完毕释放互斥锁线程B才能申请新的互斥锁并执行lock里面的代码。 四、Lock的对象选择问题 接下来说一些lock应该锁定什么对象。 1、为什么不能lock值类型 比如lock(1)呢?lock本质上Monitor.EnterMonitor.Enter会使值类型装箱每次lock的是装箱后的对象。lock其实是类似编译器的语法糖因此编译器直接限制住不能lock值类型。退一万步说就算能编译器允许你lock(1)但是object.ReferenceEquals(1,1)始终返回false(因为每次装箱后都是不同对象),也就是说每次都会判断成未申请互斥锁这样在同一时间别的线程照样能够访问里面的代码达不到同步的效果。同理lock((object)1)也不行。 2、Lock字符串 那么lock(“xxx”)字符串呢?MSDN上的原话是 锁定字符串尤其危险因为字符串被公共语言运行库 (CLR)“暂留”。 这意味着整个程序中任何给定字符串都只有一个实例就是这同一个对象表示了所有运行的应用程序域的所有线程中的该文本。因此只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁就将锁定应用程序中该字符串的所有实例。 3、MSDN推荐的Lock对象 通常最好避免锁定 public 类型或锁定不受应用程序控制的对象实例。例如如果该实例可以被公开访问则 lock(this) 可能会有问题因为不受控制的代码也可能会锁定该对象。这可能导致死锁即两个或更多个线程等待释放同一对象。出于同样的原因锁定公共数据类型(相比于对象)也可能导致问题。 而且lock(this)只对当前对象有效如果多个对象之间就达不到同步的效果。 而自定义类推荐用私有的只读静态对象比如 private static readonly object obj new object(); 为什么要设置成只读的呢?这时因为如果在lock代码段中改变obj的值其它线程就畅通无阻了因为互斥锁的对象变了object.ReferenceEquals必然返回false。 4、lock(typeof(Class)) 与锁定字符串一样范围太广了。 五、特殊问题Lockthis等的详细解释 在以前编程中遇到lock问题总是使用lock(this)一锁了之出问题后翻看MSDN突然发现下面几行字通常应避免锁定 public 类型否则实例将超出代码的控制范围。常见的结构 lock (this)、lock (typeof (MyType)) 和 lock (“myLock”) 违反此准则如果实例可以被公共访问将出现C# lock this问题。如果 MyType 可以被公共访问将出现 lock (typeof (MyType)) 问题。由于进程中使用同一字符串的任何其他代码将共享同一个锁所以出现 lock(“myLock”) 问题。 来看看C# lock this问题:如果有一个类Class1该类有一个方法用lock(this)来实现互斥 publicvoidMethod2() { lock(this) { System.Windows.Forms.MessageBox.Show(Method2End); } } 如果在同一个Class1的实例中,该Method2能够互斥的执行。但是如果是2个Class1的实例分别来执行Method2,是没有互斥效果的。因为这里的lock,只是对当前的实例对象进行了加锁。 Lock(typeof(MyType))锁定住的对象范围更为广泛由于一个类的所有实例都只有一个类型对象该对象是typeof的返回结果锁定它就锁定了该对象的所有实例微软现在建议不要使用lock(typeof(MyType)),因为锁定类型对象是个很缓慢的过程并且类中的其他线程、甚至在同一个应用程序域中运行的其他程序都可以访问该类型对象因此它们就有可能代替您锁定类型对象完全阻止您的执行从而导致你自己的代码的挂起。 锁住一个字符串更为神奇只要字符串内容相同就能引起程序挂起。原因是在.NET中字符串会被暂时存放如果两个变量的字符串内容相同的话.NET会把暂存的字符串对象分配给该变量。所以如果有两个地方都在使用lock(“my lock”)的话它们实际锁住的是同一个对象。到此微软给出了个lock的建议用法锁定一个私有的static 成员变量。 .NET在一些集合类中比如ArrayList,HashTableQueueStack已经提供了一个供lock使用的对象SyncRoot用Reflector工具查看了SyncRoot属性的代码在Array中该属性只有一句话:return this,这样和lock array的当前实例是一样的。ArrayList中的SyncRoot有所不同 get { if(this._syncRootnull) { Interlocked.CompareExchange(refthis._syncRoot,newobject(),null); } returnthis._syncRoot; 其中Interlocked类是专门为多个线程共享的变量提供原子操作如果你想锁定的对象是基本数据类型那么请使用这个类CompareExchange方法将当前syncRoot和null做比较如果相等就替换成new object()这样做是为了保证多个线程在使用syncRoot时是线程安全的。集合类中还有一个方法是和同步相关的Synchronized该方法返回一个对应的集合类的wrapper类该类是线程安全的因为他的大部分方法都用lock来进行了同步处理比如Add方法 publicoverridevoidAdd(objectkey,objectvalue) { lock(this._table.SyncRoot) { this._table.Add(key,value); } } 这里要特别注意的是MSDN提到从头到尾对一个集合进行枚举本质上并不是一个线程安全的过程。即使一个集合已进行同步其他线程仍可以修改该集合这将导致枚举数引发异常。若要在枚举过程中保证线程安全可以在整个枚举过程中锁定集合 QueuemyCollectionnewQueue(); lock(myCollection.SyncRoot){ foreach(ObjectiteminmyCollection){ //Insertyourcodehere. } } 总结 注意应避免锁定 public 类型否则实例将超出代码的控制范围。常见的结构 lock (this)、lock (typeof (MyType)) 和 lock (“myLock”) 违反此准则 1如果实例可以被公共访问将出现 lock (this) 问题 2如果 MyType 可以被公共访问将出现 lock (typeof (MyType)) 问题 3由于进程中使用同一字符串的任何其他代码将共享同一个锁所以出现 lock(“myLock”) 问题 最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。
http://www.pierceye.com/news/566232/

相关文章:

  • 建设大型网站设计公司微信公众号菜单跳转网页怎么制作
  • 昆明建设网站网页游戏4399
  • 韶关网站开发搜索引擎调价工具哪个好
  • 镇江做网站的公司上海排名前十的装修公司
  • 如何优化网站关键字网站登录 退出怎么做
  • 网站留言板怎么做湖北网站建设企业
  • 网站建设 教案装饰工程公司经营范围包括哪些?
  • 如何制作动漫网站模板下载地址wamp安装wordpress
  • 做一张简单的app网站多钱.net网站开发后编译
  • 网站上的菠菜游戏哪里可以做做移动网站优化软件
  • 延吉最好的网站建设公司单位建设网站需要的材料
  • 做可视化的网站宿迁 网站制作
  • 深圳如何搭建制作网站济南网站排名推广
  • 六感程序网站建设网站建设材料
  • 大气个人网站源码一般做门户网站多少钱
  • 东营网站推广排名榆林市工程造价信息网
  • 电影网站排名怎么做制作网站的步骤和方法
  • 请大学生做网站广东恒力建设工程有限公司网站
  • 辽宁建设工程造价管理网站业务外包服务公司
  • 合肥制作网站学校如何建设网站
  • 网站设计机构网站后台管理系统登录
  • 国家单位网站建设要多久网络营销推广公司获客
  • 网站开发 app全网推广代运营
  • 毕业设计做网站还是系统com域名注册量
  • 营销型网站建设的重要原则爱上链外链购买平台
  • 做视频网站怎么挣钱怎样进入公众号平台登录
  • 有域名怎么做公司网站天河网站建设集团
  • 重庆做网站建设的公司中国企业500强净利润排名
  • 乐亭中关村建站快车免费seo刷排名
  • 购物网站修改注册信息模块的分析查域名是否注册