zoukankan      html  css  js  c++  java
  • ThreadStatic特性标记静态字段对多线程执行的影响

    类的静态字段在类的实例中是共享的。多个线程修改实例字段的值在对其它线程来说是可见的,这也是clr默认的行为。对静态字段添加ThreadStaticAttribute标记可以改变这种默认的行为。

    ThreadStaticAttribute

    指示静态字段的值对于每个线程都是唯一的。用 ThreadStaticAttribute 标记的 static 字段不在线程之间共享。每个执行线程都有单独的字段实例,并且独立地设置及获取该字段的值。如果在不同的线程中访问该字段,则该字段将包含不同的值。

    示例代码

    代码
    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading;

    namespace NetThreading

    {

    /// <summary>

    /// 测试一般静态字段与有ThreadStatic 标记的静态字段在

    /// 多线程执行中的区别

    /// </summary>

    public class TheadStaticAttributeApp:IMain

    {

    #region IMain 成员

    public void MainRun()

    {

    MyStaticFiledClass myStaticTest 
    = new MyStaticFiledClass();

    ThreadStart ts1 
    = new ThreadStart(myStaticTest.AddXY);

    Thread t1 
    = new Thread(ts1);

    Thread t2 
    = new Thread(ts1);

    t1.Start();

    t2.Start();

    }

    #endregion

    }

    /// <summary>

    /// MyStaticTest

    /// </summary>

    class MyStaticFiledClass

    {

    /// <summary>

    /// 一般静态变量

    /// </summary>

    static int X=0;

    /// <summary>

    /// 有ThreadStatic标记的静态变量

    /// </summary>

    [ThreadStatic]

    static int threadStaticX=0;

    /// <summary>

    /// 分别对x,y 自增

    /// </summary>

    public void AddXY()

    {

    for (int i = 0; i < 10; i++)

    {

    X
    ++;

    threadStaticX
    ++;

    Thread current 
    = Thread.CurrentThread;

    string info = string.Format("threadID:{0} x={1}; [ThreadStatic]threadStaticX={2}", current.ManagedThreadId, X, threadStaticX);

    Console.WriteLine(info);

    Thread.Sleep(
    500);

    }

    }

    }

    }

    运行结果

    clip_image002

    分析

    具有ThreadStatic标记的静态变量,在每个线程中都有自己的副本。

    一般静态变量测试在进程之间共享的。t1线程中对X的修改与t2线程

    对X的修改会累积,所以x的值会是20。而对于threadStaticX来说t1

    与t2都是各自拥有的threadStaticX副本,所以threadStaticX的值为

    10.

  • 相关阅读:
    [C++知识点]2015.4.18
    [COCOS2DX]第一个开源项目的部署和运行<win32版本>
    [COCOS2DX]交叉编译实践+速度优化(vs2012修改win32代码+修改makefile+编译安卓项目包+部署安卓项目包到Eclipse+运行apk)
    [COCOS2DX]COCOS命令新建项目+编译安卓项目并成功运行
    [COCOS2DX]官网helloworld在VS2012中的部署
    【转】int const A::func()和int A::func() const
    【转】Singleton单例模式
    【转】java静态代码块和构造方法执行顺序
    小程序加入阿拉丁统计
    关于固定footer的用法
  • 原文地址:https://www.cnblogs.com/hbb0b0/p/1935587.html
Copyright © 2011-2022 走看看