• 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.

  • 相关阅读:
    Sql Server 日期时间格式转换
    Windows7中pagefil.sys和Hiberfil.sys文件删除与转移
    64位机的pl/sql不安装32位oracle的连接方式
    cmd下进入oracle sqlplus
    杂七杂八
    做题记录Ⅱ
    SPOJ GSS8
    AGC036 A-Triangle | 构造
    Atcoder 题目泛做
    CF398A Cards | 贪心
  • 原文地址:https://www.cnblogs.com/hbb0b0/p/1935587.html
Copyright © 2020-2023  润新知