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.这是怎么一回事呢 ? >_<
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.这是怎么一回事呢 ? >_<
2. 即使不用 Thread.Sleep, 改用一个长时间的 for 循环, 操作照样会互相干涉.
=======================================================
这个指你正在看得类的静态方法是线程安全的,又没指其他的类,这是你对帮助的理解错误
MSDN可能说的不是这个意思
你自己想想就能想明白 很简单的道理 一个线程操作了一次 没有执行完成 另一个线程继续操作同一变量 肯定会受影响你加上lock就没有了
lock(_count)
{}
How to: Create and Terminate Threads
http://msdn2.microsoft.com/en-us/library/7a2f3ay4.aspx