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.

  • 相关阅读:
    js使用sessionStorage、cookie保存token
    在vue项目中的main.js中直接使用element-ui中的Message 消息提示、MessageBox 弹框、Notification 通知
    git报错:'fatal:remote origin already exists'怎么处理、附上git常用操作以及说明
    Module build failed: TypeError: loaderContext.getResolve is not a function
    Git相关命令
    用户反馈录
    静雅斋数学[目录]
    探索|尝试编制高质量的跟踪训练试卷
    直线参数方程何时必须化为标准形式
    快速高效的做三角函数图像
  • 原文地址:https://www.cnblogs.com/hbb0b0/p/1935587.html
Copyright © 2011-2022 走看看