zoukankan      html  css  js  c++  java
  • 线程间不共享的静态字段

    默认情况下,静态字段在同一个应用程序域中访问这些字段的所有线程间共享。但是使用ThreadStaticAttribute将任意static字段标记为线程间不可共享的。

    //例如下面代码:
    pubic class Foo { [ThreadStaticAttribute()] public static string bar="Initialized string"; }

    下面不妨做个测试:

    首先写个常规的static字段使用方法:

      public class ThreadStaticField
        {
            //定义静态变量bar
            public static string bar = "Initialized String";
            //显示静态变量值方法
            public static void DisplayStaticFieldValue()
            {
                string msg = $"测试1:{Thread.CurrentThread.GetHashCode()}" + $" 包含静态变量的值为:{bar}";
                Console.WriteLine(msg);
            }
    
    
        }
    

    那么第二种是使用了ThreadStaticAttribute的静态字段的方法:

      public class ThreadStaticField
        {
            //定义静态变量bar
            [ThreadStaticAttribute]
            public static string bar = "Initialized String";
            //显示静态变量值方法
            public static void DisplayStaticFieldValue()
            {
                string msg = $"测试2:{Thread.CurrentThread.GetHashCode()}" + $" 包含静态变量的值为:{bar}";
                Console.WriteLine(msg);
            }
    
    
        }
    

    调用方法为:

         public static void Test()
            {
                ThreadStaticField.DisplayStaticFieldValue();
                Thread newStaticFieldThread = new Thread(ThreadStaticField.DisplayStaticFieldValue);
                newStaticFieldThread.Start();
                ThreadStaticField.DisplayStaticFieldValue();
            }

    执行程序结果为:

    分析:很明显可以看到,测试1的当前线程的散列值为9,而新线程的散列值为10,其余都相同。

    测试2中bar字段仅在访问它的第一个线程中被初始化,在所有其他线程中,这个字段被初始化为null,因此要记住:在任何线程中使用标记为ThreadStaticAttribute的静态字段之前,都要进行初始化,否则仅有当前的一个线程得到该初始值

  • 相关阅读:
    Python解析excel文件并存入sqlite数据库
    python简单爬虫
    Python开发简单记事本
    Django初体验——搭建简易blog
    LeetCode — (1)
    机器学习(九)—FP-growth算法
    机器学习(八)—Apriori算法
    linux下debug工具
    linux同步与通信
    后台开发之IO缓冲区管理
  • 原文地址:https://www.cnblogs.com/vakeynb/p/6486925.html
Copyright © 2011-2022 走看看