线程静态的几个特点

很多编码规范上都指出不要使用线程静态(ThreadStatic),这主要是为了防止在使用的时候出现意外。当有的时候这个线程静态确实会带来一些好处,如何取舍就要看具体情况了。
      首先,明确一点线程静态与标准静态之间的区别。线程静态相当于变量有线程来负责保存,因此每个线程看到都可以是不同的,但在同一个线程内是相同的。而标准静态实际上是应用程序域(AppDomain)负责保存的,因此在相同应用程序域中都看到相同的对象,而在多应用程序域的程序中,每个应用程序域中的值可以是不同的。
      两者在作用范围上的不同,导致了很多的特性上的不同。而这些通常会被混淆,这也就是为什么很多编程规范上指出不要使用线程静态的一个根本原因之一吧。
      首先,两种静态的GC回收条件不同。线程静态所在的那个线程一旦停止,GC就可以回收线程静态所引用的对象了。而标准静态只有在整个应用程序域被卸载的时候,GC才可以回收这些被引用的对象(如果是单个应用程序域的程序,就意味着必须等到整个应用程序退出)。当然,如果线程静态是在应用程序的主线程上的话,GC就只能等到整个应用程序退出的时候了。
      第二,类型初始化时对静态值的初始化效果不同。标准的静态很好理解,只要做了初始化,那就一定是这个初始值。但线程静态的类型初始化有点特别,类型初始化仅仅发生在第一次用到这个类型的线程上,因此,只有这个线程的线程静态获得了初始化,而其他线程上的这个线程静态是未设值的状态。
      第三,线程静态的对象天生是线程安全的。例如,要做一个相对于线程来说SingleTon的对象,可以非常简单的写成:
public class Foo
{
    [ThreadStatic]
    
private static Foo _instance;

    
private Foo() { }

    
public static Foo Instance
    {
        
get
        {
            
if (_instance == null)
                _instance 
= new Foo();
            
return _instance ;
        }
    }
}

      Lock完全没有存在的必要,因为不可能有两个线程访问到相同的_instance。

      第四,线程静态容易犯以下错误:
      1、在不同的线程中期望获得相同的值。
          这个很好理解,使用者没有搞清楚这是两个完全不同的线程,这是个非常容易犯的错误。
      2、相同的线程中期望获得不相同的值。
          这个可能有点意外,使用者以为这是两个不同的线程,结果却相反。听起来很荒谬,但确实有可能。如果这个两个使用者以为的线程是通过线程池跑的,那就不难理解了吧。对线程池而言,它是用一个线程模拟了多个线程,因此在这些被模拟的线程上,线程静态的值其实是同一个。

      可以看出,线程静态还是有一定风险的用法,毕竟和基于应用程序域的静态有着很大的不同。而且,在一定程度上影响了代码的可读性。所以除非有特别的需要,尽量应该避免线程静态。




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

马上工作了,想问下要注意哪些问题?

这是一位读者在知识星球提问的,涉及的内容很多,但是这些问题,我觉得很多人都需要注意,分享出来让大家看,也希望留言说下自己的看法。1一、 offer情况 1. 已签三方 2. 公司是国内靠前的芯片原厂,深圳&#x…

CSS绘图

1. 自适应的椭圆 背景知识:border-radius属性的基本用法 使用border-radius制作一个圆很简单,只要给任何正方形元素设置固定宽高及一半长度以上的border-radius,就可以得到圆形 1234background: #fb3;width: 200px;height: 200px;border-radi…

JFrame和Frame的区别

在AMT组件中分为两大类,这两类的基类分别是Component和MenuComponent,其中,MenuComponent是所有与菜单相关组件的父类,Component则是除菜单外其他AMT组件的父类,它表示一个能以图形化方式显示出来,并可与用…

51单片机——定时器

单片机——定时器 宗旨:技术的学习是有限的,分享的精神是无限的。 1、定时器和计数器 时钟周期:单片机时序中的最小单位,集体计算的放法就是时钟源分之一 机器周期:单片机完成一个操作的最短时间,12个时钟…

当年要是这样搞,我的C++也不至于这样!

C一直被称作永不过时的开发语言,比如游戏、服务器、人工智能等领域都必须用到C!虽然网上有很多教程和资料,但仍有很多人说C难学,究其原因是没有找到正确的学习方法!GoogleTest框架一直广泛应用于C/C项目测试 &#xff…

ABP之创建实体

ABP框架是一个非常庞大的框架,里面的东西有很多,那么如果我需要使用ABP进行项目的开发,具体的使用流程是怎样的呢?接下来将以一个简单的电影票管理“系统”为例子具体的实现一下。 一. 实体的创建 实体是属于领域层的,…

三亚野生植物园

近来朋友外出旅游颇多,大家分享快乐和美景的同时,文字往来也丰富。我的三亚行也该落幕了,休整得差不多了,重整行装,再踏旅途……诸君逍遥游芙蓉叶残桂满岩,粤女梦起游天姥。白塔青湖鸣沙丘,渡海峨眉牵白鹿。…

10张图22段代码,万字长文带你搞懂虚拟内存模型和malloc内部原理

成功是急不来的。不计较眼前得失,将注意力真正着眼于正在做的事情本身,持续付出努力,才能一步步向前迈进,逐渐达到理想的目标。不着急,才能从容不迫,结果自会水到渠成。大家好,我是程序喵&#…

51单片机——中断

单片机——中断 宗旨:技术的学习是有限的,分享的精神是无限的。 1、中断:放下手中的事情去处理另一种事情。 2、定时器中断 定时器是单片机模块的一个资源,确确实实存在的一个模块,中断是单片机的一种运行机制。不是一…

转!!ftp的主动模式(port)与被动模式(PASV)

转自 http://www.phpweblog.net/killjin/archive/2008/01/06/2653.htmlftp中主动模式(port)与被动模式(PASV)目录 开场白 基础 主动FTP 主动FTP的例子 被动FTP 被动FTP的例子 总结 参考资料 附录 1: 配置常见FTP服务器 开场白 处理防火墙和其他网络连接问题时最常见的…

深入MTK平台bootloader启动分析笔记

bootloader到kernel启动总逻辑流程图ARM架构中,EL0/EL1是必须实现,EL2/EL3是选配,ELx跟层级对应关系:EL0 -- appEL1 -- Linux kernel 、lkEL2 -- hypervisor(虚拟化)EL3 -- ARM trust firmware 、pre-loade…

VS2005中解决方案管理器中看不到解决方案节点的解决办法

用VS2005有一段时间了,有一个website要转换成webapplication,于是查看了一下website和webapplication的优缺点,决定以后多使用webapplication开发,但发现在使用的时候不能生成解决方案,郁闷啊,比如我新建as…

Android反翻译详解

这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而得到源代码吧,google了一下,确实很简单,以下是我的实践过程。 在此郑重声明,贴出来的目的不是为了去破解人家的软件,完全是一种学习…

51单片机——UART

单片机——UART串口通信 宗旨:技术的学习是有限的,分享的精神是无限的。 对于单片机来说,通信则与传感器、存储芯片、外围控制芯片等技术紧密结合,成为整个单片机系统的“神经中枢”。 1、初步认识 一位一位的发送出去的&#xf…

day 34 守护线程守护进程 互斥锁线程 信号量 生产者消费者

今日内容 1、守护进程vs 守护线程(*) 2、互斥锁(**) 3、信号量(**) 4、生产者消费者模型(*****) 5、GIL(什么时候用进程,什么时候用线程)&#xf…

20000W的电灯泡,真的是叼炸天

编排 | strongerHuang素材来源 | 电工电气学习1000W的灯泡有多亮? 20000W的灯泡呢?嵌入式专栏11000W灯泡一位手工帝名叫rctestflight,他认为普通白炽灯泡的能耗是LED灯8倍,他自己要做一盏最亮最亮的灯,就选择了LED灯泡…

以色列:新发明大幅提高太阳能发电效率

央视国际 [url]www.cctv.com[/url]  2007年08月22日太阳能发电是个老话题了,同时也有一个老问题,就是发电效率很低。最近,以色列科学家宣布,他们发明了一种新型的、高效太阳能发电系统,将促进太阳能在工业领域的广泛…

51单片机——I2C总线

单片机——I2C 宗旨:技术的学习是有限的,分享的精神是无限的。 UART 属于异步通信,比如电脑发送给单片机,电脑只负责把数据通过TXD 发送出来即可,接收数据是单片机自己的事情。而 I2C 属于同步通信, SCL 时…

物联网开发者被疯抢,华为做了什么?

5G时代到来,物联网技术的应用也离我们越来越近。智慧交通、智能家庭、智慧园区,越来越多的融入到我们的生活当中。所以,对于开发者而言,物联网将是未来发展的一大蓝海领域。但国内物联网人才短缺,每年人才缺口达百万之…

「网络流24题」 题目列表

「网络流24题」 题目列表 序号题目标题模型题解1飞行员配对方案问题二分图最大匹配<1>2太空飞行计划问题最大权闭合子图<2>3最小路径覆盖问题二分图最小路径覆盖<3>4魔术球问题二分图最小路径覆盖<4>5圆桌问题二分图多重匹配<5>6最长递增子序列问…