当前位置: 代码迷 >> C# >> 线程同步小疑点
  详细解决方案

线程同步小疑点

热度:164   发布时间:2016-05-05 05:16:54.0
线程同步小问题
1.Monitor.Pulse 方法:通知等待队列中的线程锁定对象状态的更改。 这个方法什么时候有用?
2.经常在代码中看到
  lock (m_ObjLock)
                    {
                        m_IntCounts = m_DicSessions.Count;
                    }

给变量赋值的过程不是特别快吗? 这个锁定有意义吗?
又不是在一个方法里面调用这个变量反复使用到,就使用一次还锁起来
3.TryEnter方法什么时候会失败?
------解决思路----------------------
i=1,就这句话,又不是原子操作,汇编是3句话,只有原子操作才是线程安全的,再不加锁的情况下
------解决思路----------------------
引用:
2.经常在代码中看到
  lock (m_ObjLock)
                    {
                        m_IntCounts = m_DicSessions.Count;
                    }

给变量赋值的过程不是特别快吗? 这个锁定有意义吗?
又不是在一个方法里面调用这个变量反复使用到,就使用一次还锁起来

运行再快,也不是“原子”的操作,这个语句执行过程中完全可能经历着集合改变。

这个 lock 不太必要,不是因为“这条语句执行的快”。就像你在 #2 楼上说的,这条语句如不 lock,给 m_IntCounts 赋值不同,不会造成程序抛出异常,因此没有必要写 lock。

如果你说“它执行挺快的,所以没有必要使用 lock”,那么一些自认为是“技术霸”的人就不干了。如果你说“不加 lock ,你也一样测试不出程序bug来!所以没有必要加 lock。”,那么他就没话说了,他必须亲自动手给你找出一个测试才行。
------解决思路----------------------
我的原则,“退一步”,我们先不谈技术理论,用测试数据说话。
------解决思路----------------------
线程同步,防止读出脏数据。
语句执行再快,也是一条指令一条指令的执行。
  相关解决方案