======关于多线程的一个示例,困惑,盼高手解惑=======
如果线程之间有共同的引用,则它们共享数据。例如下面代码::
因调用Go()方法的两个线程,拥有同一个引用,所以结果打印出来的是一个 ”Done”而不是两个。
上面都是那个示例的原话。
但是我的理解下:
假设那个实例化的线程执行到GO方法中的if(!done)后,该线程的时间片已到或调度程序把该线程挂起。主线程此时执行,并且完整的执行了整个方法。因为刚才那个实例化的线程还未来得及修改done的值为true,此时该实例化的线程再次被调度,此时,从挂起的地方if(!done){ 这里开始执行(因为已经在挂起前已经做过了判断),依然会执行后面的done=true.....,也就是说完全存在Done被输出两次的可能性。
我的说法正确吗?请指教。
1: class ThreadTest
2: {
3: bool done;
4:
5: static void Main()
6: {
7: ThreadTest tt = new ThreadTest(); // Create a common instance
8: new Thread(tt.Go).Start();
9: tt.Go();
10: }
11:
12: // Note that Go is now an instance method
13: void Go()
14: {
15: if (!done) { done = true; Console.WriteLine("Done"); }
16: }
17: }
18:
19:
因调用Go()方法的两个线程,拥有同一个引用,所以结果打印出来的是一个 ”Done”而不是两个。
上面都是那个示例的原话。
但是我的理解下:
假设那个实例化的线程执行到GO方法中的if(!done)后,该线程的时间片已到或调度程序把该线程挂起。主线程此时执行,并且完整的执行了整个方法。因为刚才那个实例化的线程还未来得及修改done的值为true,此时该实例化的线程再次被调度,此时,从挂起的地方if(!done){ 这里开始执行(因为已经在挂起前已经做过了判断),依然会执行后面的done=true.....,也就是说完全存在Done被输出两次的可能性。
我的说法正确吗?请指教。
...全文


