说说类的静态成员的不共享
作者:山东人在成都
静态成员是类成员, 只能有一个实例, 在第一次装载时被初始化, 并由同一类的多个对象所共享. 也就是说不管实例化的哪个对象最终使用的静态成员, 都是那一个. 一个对象改变了静态成员, 其他的实例对象再次使用静态成员时, 都会是已经改变后的.
当使用线程的时候, 静态成员的使用, 就必须非常小心, 不然这个改了那个改, 最后是什么, 只有计算机知道了. 这时要同步一个静态成员, 就要使用锁机制. 但结果就是一个对象锁定了它, 其他对象都使用不了.
在.NET中, ThreadStaticAttribute类可以改变这一局面, ThreadStaticAttribute用于在静态变量上为每个执行它的线程创建一个单独的变量, 而不是在线程之间共享静态变量. 也就是说带有ThreadStaticAttribute的静态变量不会在访问该变量的不同线程之间共享. 每个访问变量的线程都会有该变量的一个副本.但这种行为好像有背于静态变量的初衷.
测试代码:
public class Test { [System.ThreadStaticAttribute()] public static int x = 1; public static int y = 1; public static void Main() { Test t = new Test(); Thread t1 = new Thread(new ThreadStart(t.Run)); Thread t2 = new Thread(new ThreadStart(t.Run)); t1.Start(); t2.Start(); } public void Run() { for (int i=1; i<=10; i++) { Thread t2 = Thread.CurrentThread; x ++; y ++; Console.WriteLine("i=" + i + " ThreadID=" + t2.GetHashCode() + " x(static attribute)=" + x + " y=" + y); Thread.Sleep(1000); } } } |
阅读(885) | 评论(0) | 转发(0) |