当前位置: 首页 > 编程日记 > 正文

什么是线程安全?

http://baike.baidu.com/view/1298606.htm

线程安全

目录

什么是线程安全?
举例
线程安全性
线程安全程度
  1. 不可变
  2. 线程安全
  3. 有条件的线程安全
  4. 线程兼容
  5. 线程对立
什么是线程安全?
举例
线程安全性
线程安全程度
  1. 不可变
  2. 线程安全
  3. 有条件的线程安全
  4. 线程兼容
  5. 线程对立
展开

编辑本段什么是线程安全?

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。

编辑本段举例

比如一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。
在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而且 Size=1;
而如果是在多线程情况下,比如有两个线程,线程 A 先将元素存放在位置 0。但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会。线程B也向此 ArrayList 添加元素,因为此时 Size 仍然等于 0 (注意哦,我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加 Size 的值。
那好,现在我们来看看 ArrayList 的情况,元素实际上只有一个,存放在位置 0,而 Size 却等于 2。这就是“线程不安全”了。

编辑本段线程安全性

类要成为线程安全的,首先必须在单线程环境中有正确的行为。如果一个类实现正确(这是说它符合规格说明的另一种方式),那么没有一种对这个类的对象的操作序列(读或者写公共字段以及调用公共方法)可以让对象处于无效状态,观察到对象处于无效状态、或者违反类的任何不可变量、前置条件或者后置条件的情况。
此外,一个类要成为线程安全的,在被多个线程访问时,不管运行时环境执行这些线程有什么样的时序安排或者交错,它必须仍然有如上所述的正确行为,并且在调用的代码中没有任何额外的同步。其效果就是,在所有线程看来,对于线程安全对象的操作是以固定的、全局一致的顺序发生的。
正确性与线程安全性之间的关系非常类似于在描述 ACID(原子性、一致性、独立性和持久性)事务时使用的一致性与独立性之间的关系:从特定线程的角度看,由不同线程所执行的对象操作是先后(虽然顺序不定)而不是并行执行的。

编辑本段线程安全程度

线程安全性不是一个非真即假的命题。 Vector 的方法都是同步的,并且 Vector 明确地设计为在多线程环境中工作。但是它的线程安全性是有限制的,即在某些方法之间有状态依赖(类似地,如果在迭代过程中 Vector 被其他线程修改,那么由 Vector.iterator() 返回的 iterator会抛出ConcurrentModifiicationException)。
对于 Java 类中常见的线程安全性级别,没有一种分类系统可被广泛接受,不过重要的是在编写类时尽量记录下它们的线程安全行为。
Bloch 给出了描述五类线程安全性的分类方法:不可变、线程安全、有条件线程安全、线程兼容和线程对立。只要明确地记录下线程安全特性,那么您是否使用这种系统都没关系。这种系统有其局限性 -- 各类之间的界线不是百分之百地明确,而且有些情况它没照顾到 -- 但是这套系统是一个很好的起点。这种分类系统的核心是调用者是否可以或者必须用外部同步包围操作(或者一系列操作)。下面几节分别描述了线程安全性的这五种类别。

不可变

不可变的对象一定是线程安全的,并且永远也不需要额外的同步[1]。因为一个不可变的对象只要构建正确,其外部可见状态永远也不会改变,永远也不会看到它处于不一致的状态。Java 类库中大多数基本数值类如 Integer 、 String 和 BigInteger 都是不可变的。

线程安全

线程安全的对象具有在上面“线程安全”一节中描述的属性 -- 由类的规格说明所规定的约束在对象被多个线程访问时仍然有效,不管运行时环境如何排列,线程都不需要任何额外的同步。这种线程安全性保证是很严格的 -- 许多类,如 Hashtable 或者 Vector 都不能满足这种严格的定义。

有条件的线程安全

有条件的线程安全类对于单独的操作可以是线程安全的,但是某些操作序列可能需要外部同步。条件线程安全的最常见的例子是遍历由 Hashtable 或者 Vector 或者返回的迭代器 -- 由这些类返回的 fail-fast 迭代器假定在迭代器进行遍历的时候底层集合不会有变化。为了保证其他线程不会在遍历的时候改变集合,进行迭代的线程应该确保它是独占性地访问集合以实现遍历的完整性。通常,独占性的访问是由对锁的同步保证的 -- 并且类的文档应该说明是哪个锁(通常是对象的内部监视器(intrinsic monitor))。
如果对一个有条件线程安全类进行记录,那么您应该不仅要记录它是有条件线程安全的,而且还要记录必须防止哪些操作序列的并发访问。用户可以合理地假设其他操作序列不需要任何额外的同步。

线程兼容

线程兼容类不是线程安全的,但是可以通过正确使用同步而在并发环境中安全地使用。这可能意味着用一个 synchronized 块包围每一个方法调用,或者创建一个包装器对象,其中每一个方法都是同步的(就像 Collections.synchronizedList() 一样)。也可能意味着用 synchronized 块包围某些操作序列。为了最大程度地利用线程兼容类,如果所有调用都使用同一个块,那么就不应该要求调用者对该块同步。这样做会使线程兼容的对象作为变量实例包含在其他线程安全的对象中,从而可以利用其所有者对象的同步。
许多常见的类是线程兼容的,如集合类 ArrayList 和 HashMap 、 java.text.SimpleDateFormat 、或者 JDBC 类 Connection 和 ResultSet 。

线程对立

线程对立类是那些不管是否调用了外部同步都不能在并发使用时安全地呈现的类。线程对立很少见,当类修改静态数据,而静态数据会影响在其他线程中执行的其他类的行为,这时通常会出现线程对立。线程对立类的一个例子是调用 System.setOut() 的类。
参考资料
  • 1

    线程安全程度及其类别

    http://www.ibm.com/developerworks/cn/java/j-jtp09263/

相关文章:

中国开源大爆发进行时,你没掉队吧?

作者 | 陈利鑫头图 | CSDN 下载自东方 IC出品 | CSDN(ID:CSDNnews)从开源(Open Source)一词提出到如今,开源的概念越来越成熟,作为一种创造及协作模式,开源已经不仅仅局限于软件技术…

eclipse设置

2019独角兽企业重金招聘Python工程师标准>>> eclipse 下载 地址 http://www.eclipse.org/downloads/packages/release/Ganymede/SR2 设置 jdk 参数 jre definition vm arguments -Xms800m -Xmx800m -XX:MaxNewSize256m -XX:MaxPermSize256m -Dfile.encod…

吊打一切:YOLOv4的tricks汇总

来源 | AI算法与图像处理(ID:AI_study)即使是目标检测在过去几年开始成熟,竞争仍然很激烈。如下所示,YOLOv4声称拥有最先进的精度,同时保持高处理帧速率。它在 MS COCO数据集上,使用Tesla V100以接近65 FPS…

如何播放RM文件?

<EMBED SRC"MY_LIFE.RPM" WIDTH300 HEIGHT134 >Tip:SRC是可以省略的&#xff0c;当mime Type 参数如下时&#xff1a;<EMBED ...,TYPE"audio/x-pn-realaudio-plugin",...>&#xff0c;这样做会产生不可预料的结果&#xff0c;因此强烈推荐你包…

mongodb地理位置索引实现原理

地理位置索引支持是MongoDB的一大亮点&#xff0c;这也是全球最流行的LBS服务foursquare 选择MongoDB的原因之一。我们知道&#xff0c;通常的数据库索引结构是B Tree&#xff0c;如何将地理位置转化为可建立BTree的形式&#xff0c;下文将为你描述。 首先假设我们将需要索引的…

NSMakeRange基础函数应用

NSRange NSMakeRange (NSUInteger loc,NSUInteger len );这是官方得接口描述。loc 为location缩写&#xff0c;len 表示长度。作用&#xff1a;在loc指定得位置开始往后获取len长度个得元素。示例程序使用这个函数来为指定数组得某个位置向后指定长度得元素集合。如NSRange NSM…

上传图片,要求图片200100象素,大小小于2M

作者&#xff1a;网际浪子专栏&#xff08;曾用名littlehb&#xff09; http://blog.csdn.net/littlehb/上传图片&#xff0c;要求图片200100象素&#xff0c;大小小于2M&#xff0c;如果图片不符合要求&#xff0c;不能上传&#xff0c;否则上传图片&#xff0c;上传以后对图…

炸裂!这些大厂跪求的人才太牛了!

今年所有的互联网公司都在ALL in AI&#xff0c;百度、腾讯、阿里巴巴、京东等互联网巨头都在四处挖掘AI人才。AI的岗位需求很多&#xff0c;几乎每天都有数百个JD放出。而亿欧智库发布的《2020全球人工智能人才培养研究报告》提到&#xff0c;近4年AI人才的需求量以每年74%的速…

新春祝福必杀计之发送短信攻略

新的一年就要到了&#xff0c;陆陆续续的收到很多同事们的短信祝福&#xff0c;哎&#xff0c;不能欠人家的人情债啊&#xff0c;但是我实在是个懒人啊&#xff0c;这个祝福短信还是要回复的啊&#xff0c;我的手机里有超过百位联系人&#xff0c;全是和工作有关的&#xff0c;…

centos6.5环境DNS-本地DNS主从服务器bind的搭建

centos6.5环境DNS-本地DNS主从服务器bind的搭建在上一篇博客中我已经搭建好了一个本地DNS服务器&#xff0c;能够实现正向反向解析&#xff0c;那么我们只需要加入一台从DNS服务器即可完成&#xff0c;我们来开始配置主从服务器&#xff1a;一&#xff0e;主DNS服务器上面的额外…

再见,Python!

结合我最近这些年的 Python 学习、开发经验&#xff0c;发现近90%的程序员在学 Python 时都会遇到下面这3个问题&#xff1a;1.想学Python&#xff0c;但不知从何学起&#xff0c;应用方向太多了也不知道该选择什么方向...2.基础入门看似简单&#xff0c;但是进阶实战就举步维艰…

如何更新父窗体

Response.Write("<script languagejavascript>window.opener.locationwindow.opener.location.href;</script>") 第一种方案是&#xff1a;file a.htm function OpenDialog(url,param){return window.open(url,param, "DialogWidth:450px;DialogH…

文件体积单位的换算

单位转换&#xff08;参考&#xff09;&#xff1a; 1bit&#xff08;这个比特表示一个二进制数字&#xff09; 1Byte&#xff08;这个单词音译过来也叫“比特”但是表示一个十六进制的数字&#xff09; 1B1Byte8bit 1 kB 1024 B (kB - kilobyte) 千 1 MB 1024 kB (MB - mega…

防止盗链下载问题

经常在网络上四处载东西&#xff0c;有时碰到直接拷贝一个类似 http://193.100.100.56/TestWebSolution/WebApplication1/test.rar地址准备下载test.rar文件时&#xff0c;却被告知没有登录或者直接跳转到其他页面的情况&#xff0c;然后等登录后直接下载该文件。要实现上面情况…

中国人工智能市场破 50 亿!你还不了解 AI 云服务吗?

作者 | 马超责编 | 伍杏玲出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;从AI的发展趋势来看&#xff0c;最新的人工智能模型对于算力的要求往往较高&#xff0c;如谷歌的T5&#xff0c;其整个模型的参数数量达到了惊人的 110 亿&#xff0c;谷歌科学家更在T5的论…

Java中数据存储方式

2019独角兽企业重金招聘Python工程师标准>>> 1&#xff0e; 寄存器&#xff08;register&#xff09;。这是最快的存储区&#xff0c;因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限&#xff0c;所以寄存器由编译器根据需求进行分配。你…

Oracle与JCP执行委员会分享了他们的Java EE策略

Anil Gaur是Oracle集团负责Java EE和WebLogic Server的副总裁。他受邀在上一次的JCP执行委员会会议上发表了演讲&#xff0c;透露了有关Java EE未来发展的一些信息。他所传达的信息和Oracle之前的说法一致&#xff1a;企业编程正在发生变化&#xff0c;Oracle希望适应这种变化。…

5G:新基建的压舱石,如何为新基建按下“加速键”?

受访嘉宾 | 广和通 CEO 应凌鹏记者 | 邓晓娟2019 年&#xff0c;伴随着 5G 的浪潮&#xff0c;5G、AI、AIoT等新兴技术得到了全面的爆发&#xff0c;过去人们认为遥不可及的「高科技」&#xff0c;也逐渐走下“神坛”来进入大家的生活。5G 时代的万物互联&#xff0c;在本次疫情…

no argument specified with option /LIBPATH:错误的解决

作者&#xff1a;朱金灿来源&#xff1a;http://blog.csdn.net/clever101下午使用VS2005编译工程碰到一个链接错误&#xff1a;no argument specified with option "/LIBPATH:"。检查了链接库的文件路径&#xff0c;发现某个路径是非法的&#xff08;即不存在该文件路…

Animation 模拟纸盒的爆破

用简单的Animation动作模拟爆破的瞬间&#xff0c;仔细的调整各种参数效果会更像 原理&#xff1a;用定义好的纸张从onTouch中心点向四面八方散开&#xff0c;散开过程中&#xff0c;使用不用的速度、大小、方向、旋转角度、透明度&#xff08;这里纸张可以加上火焰&#xff0c…

代码恒久远,GitHub 永流传

作者 | 唐小引题图 | GitHub来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;这两天&#xff0c;在 GitHub 上积极贡献代码的许多开发者都收到了「Arctic Code Vault Contributor」的荣誉勋章的通知&#xff0c;并非常兴奋地晒起了朋友圈。因为这标志着自己在 GitHu…

不允许后退的方法

由于项目的需要不允许系统在提交之后&#xff0c;按IE的后退按钮进行再次提交。试试了一下在 .NET中通过如下语句 Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);就可以使页面的缓存失效&#xff0c;每次都需要获取新页面。 <script>history.for…

3个题目熟悉类和对象基础

1、按要求编写Java应用程序&#xff1a; &#xff08;1&#xff09;编写西游记人物类&#xff08;XiYouJiRenWu&#xff09;其中属性有&#xff1a;身高&#xff08;height&#xff09;&#xff0c;名字&#xff08;name&#xff09;&#xff0c;武器&#xff08;weapon&#x…

按下回车表示确定提交

<body οnkeydοwn"if (event.keyCode13) {document.all.button2.click()}"> 下面的五种方法都可以帮你解决这种问题1.<script languagejavascript>function document.onkeydown(){ if (event.keyCode 13) { if (event.srcElement docum…

A股暴跌,户均亏2万!刚写好的辞职信又撕了……

仅用1天&#xff0c;A股市值单日蒸发达到3.5万亿&#xff0c;人均亏了超2万&#xff01;“芯片龙头”企业中芯国际正式登陆科创板&#xff0c;使得半导体板块整体跌幅较小。中芯国际上市首日涨幅超200%&#xff0c;收报82.92元&#xff0c;总市值达6137.57亿元&#xff0c;成为…

DataList在无数据记录时显示类似GridView空模板(EmptyDataTemplate)

在FooterTemplate加个Label并根据repeater.Items.Count判断是否有记录。HTML代码&#xff1a; <FooterTemplate> <asp:Label ID"lblEmpty" Text"No data recprd exist !" runat"server" Visible<%#bool.Parse((DataList1.I…

QButtonGroup 的使用

1、3以后尽量手写&#xff0c;因为没有现在的控件了 2、 1 // lyy : 2016/8/26 12:17:41 说明:存放radioButton2 QButtonGroup *buttonGroup;3 // lyy : 2016/8/26 11:11:55 说明:radioButton4 buttonGroup new QButtonGroup();5 buttonGroup->addButt…

机器学习算法易受攻击?阿里“安全基建”这样应对AI的不安全

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;数字基建的浪潮之下&#xff0c;诸多行业领域都在加速融合5G、大数据中心、AI等新技术&#xff0c;向数字化转型。近日&#xff0c;多位全国政协委员、院士和安全行业专家提出&#xff0c;应尽快出台安全基建国家标准&…

不可以输入中文

function checkCH() {var strtxtPwd.value;var c /[/u4e00-/u9fa5]/;if(c.test(str)){alert("不能输入中文。");return false;}return true; }

tomcat虚拟路径的几种配置方法

tomcat配置虚拟路径的4种方法在tomcat中&#xff0c;webapp文件夹默认为web应用的根目录。1.在tomcat\conf\server.xml中找到 host标签&#xff0c;在host标签中增加新的元素<Context/>并设置 Context的元素&#xff0c;其中path元素所设置的值就是在浏览器中所要访问的虚…