Chinaunix首页 | 论坛 | 博客
  • 博客访问: 165298
  • 博文数量: 36
  • 博客积分: 2160
  • 博客等级: 大尉
  • 技术积分: 382
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-27 01:48
个人简介

喝喝咖啡,做做开发

文章分类
文章存档

2014年(4)

2013年(1)

2012年(4)

2011年(2)

2010年(3)

2009年(9)

2008年(3)

2007年(10)

我的朋友

分类: 嵌入式

2007-08-30 16:27:40

说说类的静态成员的不共享
作者:山东人在成都
    静态成员是类成员, 只能有一个实例, 在第一次装载时被初始化, 并由同一类的多个对象所共享. 也就是说不管实例化的哪个对象最终使用的静态成员, 都是那一个. 一个对象改变了静态成员, 其他的实例对象再次使用静态成员时, 都会是已经改变后的.
    当使用线程的时候, 静态成员的使用, 就必须非常小心, 不然这个改了那个改, 最后是什么, 只有计算机知道了. 这时要同步一个静态成员, 就要使用锁机制. 但结果就是一个对象锁定了它, 其他对象都使用不了.
    在.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) |
给主人留下些什么吧!~~