博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程安全
阅读量:6954 次
发布时间:2019-06-27

本文共 710 字,大约阅读时间需要 2 分钟。

  hot3.png

概述

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。

线程安全问题都是由全局变量及静态变量引起的。

若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

举例

比如一个 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。这就是“线程不安全”了。

转载于:https://my.oschina.net/wzzz/blog/423809

你可能感兴趣的文章
const、static、内部链接属性和外部链接属性整理
查看>>
nginx+多个tomcat配置
查看>>
c++ primer习题9.34, 9.35, 9.40
查看>>
sublime实用插件-持续更新
查看>>
“敏捷积累”
查看>>
DotImage使用教程:从数据库中读写图像
查看>>
10 个很棒的 jQuery 代码片段
查看>>
mybatis 刷新 xml
查看>>
行业虚拟化发展趋势——“瑞友杯”虚拟化征文
查看>>
Linux初学者实验环境之创建虚拟机
查看>>
XY问题在开发中的体现
查看>>
更换或加装网卡的eth编号顺序配置
查看>>
Executors下面的线程池实现
查看>>
锐捷CCNA系列(五) 交换机配置模式切换
查看>>
squid命中率监控软件安装
查看>>
0627 网站的一次密码***,添加iptables问题
查看>>
基于Kubeadm的Flannel分析
查看>>
GlusterFS: 访问权限设置
查看>>
汉化WordPress,拥有“火星文”式的后台
查看>>
我的友情链接
查看>>