解决方案 »

  1.   

    即使赋值的时候m_DicSessions.Count又有了变动,赋值不也是成功的,变动就让它变动啊,只是觉得这个锁定没有意义
      

  2.   

    本帖最后由 bdmh 于 2015-01-04 14:15:40 编辑
      

  3.   

    运行再快,也不是“原子”的操作,这个语句执行过程中完全可能经历着集合改变。这个 lock 不太必要,不是因为“这条语句执行的快”。就像你在 #2 楼上说的,这条语句如不 lock,给 m_IntCounts 赋值不同,不会造成程序抛出异常,因此没有必要写 lock。如果你说“它执行挺快的,所以没有必要使用 lock”,那么一些自认为是“技术霸”的人就不干了。如果你说“不加 lock ,你也一样测试不出程序bug来!所以没有必要加 lock。”,那么他就没话说了,他必须亲自动手给你找出一个测试才行。
      

  4.   

    原子操作是不可分割的,在执行完毕之前不会被任何其它任务或事物中断。如何识别原子操作?32位处理器(x86系列)或32位软件理论上一次能处理32位,也就是4个字节的数据;而64位处理器(x64系列)或64位软件理论上一次就能处理64位,即8个字节的数据。在处理器|软件能一次处理的位数范围内的单个操作即为原子操作。(这段文字也告诉我们:(1)64位操作系统或64位软件理论上运行更快;(2)32位操作系统上为什么不能运行64位软件,而反过来却可以。)在多线程编程环境中指:一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源。.NET为我们提供了多种线程同步的方法,我们可以根据待同步粒度大小来选择合适的同步方式。
      

  5.   

    4)   示例:在大多数计算机上,增加变量操作不是一个原子操作,需要执行下列步骤:a)         将实例变量中的值加载到寄存器中。b)         增加或减少该值。c)         在实例变量中存储该值。如果不使用 Increment 和 Decrement,线程可能会在执行完前两个步骤后被抢先。然后由另一个线程执行所有三个步骤。当第一个线程重新开始执行时,它改写实例变量中的值,造成第二个线程执行增减操作的结果丢失。(线程都维护着自己的寄存器)