• Are you familiar with [ThreadStatic]?


    如果你正在寻找一些关于线程本地存储的内容,你可能会对performance comparison between Thread.SetData and [ThreadStatic].感兴趣。

    ThreadStatic 超级酷,如果你有一个静态变量,你可以通过在属性上面设置它来使这个属性对“每个线程”是静态的。这是一个简单的绕过使用静态变量时的线程安全性问题的方法- 由于它们是一个线程一个的,当你更新它们时你不必使用锁。

    [ThreadStatic]
    private static string Foo;
    

    现在可以绊倒你的就是初始化了。

    [ThreadStatic]
    private static string Foo = "the foo string";
    

     TreadStatic 在静态构造函数中初始化 - 它只执行一次。所以只有当静态构造函数执行时,第一个执行的线程才会被赋值"the foo string".当顺序访问所有的线程时,Foo 仍然是未初始化的空值。

    最好的绕过这个问题的方法是使用一个属性来访问Foo属性。

            [ThreadStatic]
            private static string _foo;
    
            public static string Foo
            {
                get
                {
                    if (_foo == null)
                    {
                        _foo = "the foo string";
                    }
                    return _foo;
                }
            }
    

    如果你有一些可以合理地设置为空值的属性,你可以总是使用一个静态线程布尔属性"_fooInitialized".

            [ThreadStatic]
            private static string _foo;
    
            [ThreadStatic]
            private static bool _fooInitialized;
    
            public static string Foo
            {
                get
                {
                    if (!_fooInitialized)
                    {
                        _fooInitialized = true;
                        _foo = "the foo string";
                    }
                    return _foo;
                }
            }
    

    而且如果你有很多布尔型变量,你可能想要节省空间;无论你是否相信一个布尔型变量占据珍贵的比特(可以通过打印出Marshal.SizeOf(typeof(bool))来获取额外的证据)

    你可以把它们合并成一个比特变量来节省空间。

            [ThreadStatic]
            private static string _foo;
    
            [ThreadStatic]
            private static string _goo;
    
            [ThreadStatic]
            private static BitVector32 _state = new BitVector32();
    
            private const int stateFooInitialized = 0x0001;
            private const int stateGooInitialized = 0x0002;
            // ... 0x0004, 0x0008 ...
    
            public static string Foo
            {
                get
                {
                    if (!_state[stateFooInitialized])
                    {
                        _state[stateFooInitialized] = true;
                        _foo = "the foo string";
                    }
                    return _foo;
                }
            }
    
            public static string Goo
            {
                get
                {
                    if (!_state[stateGooInitialized])
                    {
                        _state[stateGooInitialized] = true;
                        _goo = "the goo string";
                    }
                    return _goo;
                }
            }
    


    作者:DanielWise
    出处:http://www.cnblogs.com/danielWise/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    4 构建Mysql+heartbeat+DRBD+LVS集群应用系统系列之Lvs为Mysql-slave做负载均衡
    3 构建Mysql+heartbeat+DRBD+LVS集群应用系统系列之heartbeat的搭建
    2 构建Mysql+heartbeat+DRBD+LVS集群应用系统系列之MySql的搭建
    1 构建Mysql+heartbeat+DRBD+LVS集群应用系统系列之DRBD的搭建
    Python
    Python
    Tools
    DevOps
    Tools
    Tools
  • 原文地址:https://www.cnblogs.com/danielWise/p/1961933.html
Copyright © 2020-2023  润新知