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

  • 相关阅读:
    51nod 1179 最大的最大公约数 (数论)
    POJ 3685 二分套二分
    POJ 3045 贪心
    LIC
    HDU 1029 Ignatius and the Princess IV
    HDU 1024 Max Sum Plus Plus
    HDU 2389 Rain on your Parade
    HDU 2819 Swap
    HDU 1281 棋盘游戏
    HDU 1083 Courses
  • 原文地址:https://www.cnblogs.com/hbb0b0/p/1935587.html
Copyright © 2020-2023  润新知