Java线程安全问题
线程安全问题是一个老生常谈的问题,那么多线程环境下究竟有那些问题呢?这么说吧,问题的形式多种多样的,归根结底的说是共享资源问题,无非可见性与有序性问题。
1. 可见性
可见性是对于内存中的共享资源来说。线程作为单一的控制流,在运行的程序内线程必须拥有一些资源作为开销。例如线程的堆栈和私有的程序计数器,线程之间的堆栈是不共享的,每个线程都有自己的堆栈,当然在Java中对于线程私有的内存区域只有程序执行栈与程序计数器。每个线程的运算操作都在自己的执行栈中进行。正是由于这样的结构设计,所以对于内存我们可以分为共享内存(Java中的堆)和工作内存(线程执行栈)。
对于共享内存而言,线程并不会直接去操作它,线程对于数据的运算也并不是直接发生在共享内存中的。这里有一个值拷贝的过程,线程在执行时会将用到的共享数据从共享内存中拷贝到工作内存中,从工作内存中完成计算之后,再复制到共享内存中。
所以当多线程操作共享内存时,一个线程修改了主内存的内容,那么其他线程是否能察觉到主内存的变化呢?对于可见性有一个经典的ABA问题。其实造成ABA问题的根本原因是因为内存的可见性问题。当一个线程修改了内存值之后,其他线程并不能立刻感知到。
2. 有序性
谈到有序性就要说起操作系统的调度算法了。我们知道线程是操作系统所能调度的最小单元,既然线程归操作系统调度,那么它是如何调度的呢?不同应用场景下的调度算法不太一致,常见的调度算法有时间片轮转算法与多级反馈队列,一般的分时操作系统都会采用时间片轮转算法进行线程的调度。
所谓时间片轮转算法,就是给每个线程一定的执行时间片。当这个线程的时间片用完之后就会调度另一个线程执行。通过这个算法的特点我们便知道,如果使用这样的算法,那么程序执行的单位变成了时间片,而并不是一次程序执行。正是这样就不能保障在时间片使用完毕后,程序能够按照正常的执行逻辑停止运行交出使用权。也就是说程序停止的位置具有不确定性。这样一来顺序的控制流就变得无序了。而无序也无伤大雅,重点是对于共享资源的访问,不能无序,要有序访问共享资源。
同时,有序性的另一个层面是线程同步问题。线程的调度由操作系统负责,多个线程执行的顺序我们无法得知。这样线程执行顺序的的无序有时也会带来问题。
Java线程安全问题的更多相关文章
- (转)java线程安全问题之静态变量、实例变量、局部变量
java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编程实践>中所说: 写道 给线程安全下定义比较困难.存在很多种定义,如 ...
- java线程安全问题以及使用synchronized解决线程安全问题的几种方式
一.线程安全问题 1.产生原因 我们使用java多线程的时候,最让我们头疼的莫过于多线程引起的线程安全问题,那么线程安全问题到底是如何产生的呢?究其本质,是因为多条线程操作同一数据的过程中,破坏了数据 ...
- java线程安全问题之静态变量、实例变量、局部变量
java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编程实践>中所说: 写道 给线程安全下定义比较困难.存在很多种定义,如 ...
- Java 线程安全问题
线程安全问题产生原因: 1.多个线程操作共享的数据: 2.操作共享数据的线程代码有多条. 当一个线程正在执行操作共享数据的多条代码过程中,其它线程也参与了运算, 就会导致线程安全问题的发生. cl ...
- java线程安全问题原因及解决办法
1.为什么会出现线程安全问题 计算机系统资源分配的单位为进程,同一个进程中允许多个线程并发执行,并且多个线程会共享进程范围内的资源:例如内存地址.当多个线程并发访问同一个内存地址并且内存地址保存的值是 ...
- Java 线程安全问题的本质
原创声明:作者:Arnold.zhao 博客园地址:https://www.cnblogs.com/zh94 目录: 线程安全问题的本质 理解CPU JVM虚拟机类比于操作系统 重排序 汇总 一些解释 ...
- java线程安全问题原理性分析
1.什么是线程安全问题? 从某个线程开始访问到访问结束的整个过程,如果有一个访问对象被其他线程修改,那么对于当前线程而言就发生了线程安全问题:如果在整个访问过程中,无一对象被其他线程修改,就是线程安全 ...
- 关于 SimpleDateFormat 的非线程安全问题及其解决方案
一直以来都是直接用SimpleDateFormat开发的,没想着考虑线程安全的问题,特记录下来(摘抄的): 1.问题: 先来看一段可能引起错误的代码: package test.date; impor ...
- Java多线程--线程安全问题的相关研究
在刚刚学线程的时候我们经常会碰到这么一个问题:模拟火车站售票窗口售票.代码如下: package cn.blogs.com.isole; /* 模拟火车站售票窗口售票,假设有50张余票 */ publ ...
随机推荐
- CF1466-D. 13th Labour of Heracles
CF1466-D. 13th Labour of Heracles 题意: 给出一个由\(n\)个点构成的树,每个点都有一个权值.现在你可以用\(k,k\subset\)\([1, n]\)个颜色来给 ...
- GoAccess 监控工具
GoAccess 基本概述 简易的统计访问量的软件,官方安装教程 GoAccess 安装 # 下载包 [root@web01 ~]# wget http://tar.goaccess.io/goacc ...
- MySQL 误删用户故障解决方案
目录 "误删"所有用户 解决方式一: 停止数据库 跳过 授权表 和 网络启动(重要) 插入新的用户 重启启动数据库 解决方式二: 停止数据库 跳过 授权表 和 网络启动(重要) 授 ...
- 6.Header交换机之模拟验证用户身份
标题 : 6.Header交换机之模拟验证用户身份 目录 : RabbitMQ 序号 : 6 var channel = connection.CreateModel(); //设置服务质量 ch ...
- go免杀初探
0x01 go免杀 由于各种av的限制,我们在后门上线或者权限持久化时很容易被杀软查杀,容易引起目标的警觉同时暴露了自己的ip.尤其是对于windows目标,一个免杀的后门极为关键,如果后门文件落不了 ...
- 在Python里,用股票案例讲描述性统计分析方法(内容来自我的书)
描述性统计是数学统计分析里的一种方法,通过这种统计方法,能分析出数据整体状况以及数据间的关联.在这部分里,将用股票数据为样本,以matplotlib类为可视化工具,讲述描述性统计里常用指标的计算方法和 ...
- Web 开发之 HTTP/2 & SPDY & HTTP 1.1 & HTTP 对比分析详解!
1 https://zh.wikipedia.org/wiki/HTTP/2 HTTP/2 维基百科,自由的百科全书 HTTP/2(超文本传输协议第2版 ...
- CSS 检测 IE 浏览器
CSS 检测 IE 浏览器 <!--[if IE]> <link href="ie.css" rel="stylesheet"> < ...
- hardsource bug
hardsource bug webpack crashed bug memory stackoverflow [hardsource:32210703] Could not freeze refs ...
- Google Developer Days 2019 & GDD
Google Developer Days 2019 2019 Google 开发者大会 GDD Google Developer Days https://events.google.cn/intl ...