MSDN 上每当列举出一个类型, 都会有一栏注明:Public static members of this type are thread safe, Any instance members are not guaranteed to be thread safe.个人理解其中文意思是: 属于这个类型的公共静态成员都是线程安全的, 而实例成员不保证线程安全. (如果理解有错误请指出 >_<)根据这个说法, 对 public static 的情况做了一个测试, 源代码如下, 其大意是建立一个类型, 含有两个成员函数对内部计数器 i 分别进行加减操作, 并把 i 值写入 log. 然后为这个类型申明一个 public static 变量, 操作这个静态变量观察其对 i 的操作是否属于线程安全.================= TSyncTest 类 ============================    public class TSyncTest {
      private int _counter = 0;      public void Increase() {
        for (int i = 0; i < 5; i++) {
          _counter++;
          TTestApp.Log(_counter.ToString() + "\r\n");
          Thread.Sleep(100)
        }
      }      public void Decrease() {
        for (int i = 0; i < 5; i++) {
          _counter--;
          TTestApp.Log(_counter.ToString() + "\r\n");
          Thread.Sleep(100)
        }
      }
    }================= 实际开两个线程调用 ============================      public static TSyncTest _test = new TSyncTest();      ThreadStart starter = delegate() {
        _test.Increase();
      };      Thread th = new Thread(starter);
      th.Start();
      _test.Decrease();=================================================================按照预想, log 中的记录应该是 0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0 这样按 Increase 和 Decrease 顺序来的, 但实际发现两个操作互相干涉, Increase 操作到一半, 然后 Decrease 插入, 等到 Increase 完成返回后 _counter 肯定不是 5.这是怎么一回事呢 ? >_<

解决方案 »

  1.   

    肯定是这样了,Thread.Sleep(100),是线程停止运行一段时间,这个时候自然会有其它线程来接管
      

  2.   

    不是 Thread.Sleep 的问题.1. Thread.Sleep 在官方的线程安全教程中也出现. 应该没有副作用.
    2. 即使不用 Thread.Sleep, 改用一个长时间的 for 循环, 操作照样会互相干涉.
      

  3.   

    MSDN 上每当列举出一个类型, 都会有一栏注明:Public static members of this type are thread safe, Any instance members are not guaranteed to be thread safe.个人理解其中文意思是: 属于这个类型的公共静态成员都是线程安全的, 而实例成员不保证线程安全. (如果理解有错误请指出 >_<)
    =======================================================
    这个指你正在看得类的静态方法是线程安全的,又没指其他的类,这是你对帮助的理解错误
      

  4.   

    肯定会不是你假想的
    MSDN可能说的不是这个意思 
    你自己想想就能想明白 很简单的道理 一个线程操作了一次 没有执行完成 另一个线程继续操作同一变量 肯定会受影响你加上lock就没有了
    lock(_count)
    {}
      

  5.   

    同意coowoo的观点,MSDN那句话楼主翻译对了,可是理解有误。对于MSDN列举出来的线程安全类型是经过封装了的,其内部一定已经有着合理的多线程处理方法,楼主自己构造的类型要想保证线程安全当然也需要额外代码处理。
      

  6.   

    好文章不敢独享:
    How to: Create and Terminate Threads
    http://msdn2.microsoft.com/en-us/library/7a2f3ay4.aspx
      

  7.   

    to:你加上lock就没有了int是值类型不能lock. 再想想int本身就是属于原子操作, 从另一个角度看_counter不是5,就一定意味着线程不安全了吗?每一个线程每一次对i的操作都是完整的,都是most up to date的. 不能说不安全吧. 最多再加上volatile.大家怎么看