volatile关键字和Java线程安全问题
一、java中的线程安全问题
我们都知道,Java是一种夸平台的语言,因此Java这种语言在处理线程安全问题的时候,会有自己的处理机制,例如volatile关键字,synchronized关键字,并且这种机制适用于各种平台。
Java内存模型规定所有的变量都是存在主存当中(类似于前面说的物理内存),每个线程都有自己的工作内存(类似于前面的高速缓存)。线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。
由于java中的每个线程有自己的工作空间,这种工作空间相当于上面所说的高速缓存,因此多个线程在处理一个共享变量的时候,就会出现线程安全问题。
二、volatile关键字
被volatile关键字声明的变量可以保证可见性和有序性,从而保证java线程安全。
声明方式:public volatile int a;
那么什么是可见性和有序性呢?
1、什么是可见性?
意思就是说,在多线程环境下,某个共享变量如果被其中一个线程给修改了,其他线程能够立即知道这个共享变量已经被修改了,当其他线程要读取这个变量的时候,最终会去内存中读取,而不是从自己的工作空间中读取。
假如一个变量被声明为volatile,那么这个变量就具有了可见性的性质了。这就是volatile关键的作用之一了。
2、什么是有序性?
实际上,当我们把代码写好之后,虚拟机不一定会按照我们写的代码的顺序来执行。例如对于下面的两句代码:
int a = 1;
int b = 2;
对于这两句代码,你会发现无论是先执行a = 1还是执行b = 2,都不会对a,b最终的值造成影响。所以虚拟机在编译的时候,是有可能把他们进行重排序的。
为什么要进行重排序呢?
你想啊,假如执行 int a = 1这句代码需要100ms的时间,但执行int b = 2这句代码需要1ms的时间,并且先执行哪句代码并不会对a,b最终的值造成影响。那当然是先执行int b = 2这句代码了。
所以,虚拟机在进行代码编译优化的时候,对于那些改变顺序之后不会对最终变量的值造成影响的代码,是有可能将他们进行重排序的。
而如果变量被声明了volatile,那么就能保证,这个变量之前的代码一定会比它先执行,之后的代码一定会比它慢执行。
3、什么情况下volatile能够保证线程安全?
刚才虽然说,volatile关键字不一定能够保证线程安全的问题,其实,在大多数情况下volatile还是可以保证变量的线程安全问题的。所以,在满足以下两个条件的情况下,volatile就能保证变量的线程安全问题:
- 运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。
- 变量不需要与其他状态变量共同参与不变约束。
volatile关键字和Java线程安全问题相关推荐
- 关于如何解决java线程安全问题?很重要? 快拿小本本记下来!
关于如何解决java线程安全问题?很重要? 快拿小本本记下来! 线程安全问题 什么是线程安全问题? 线程同步 同步代码块 同步方法 lock显示锁 线程安全问题 什么是线程安全问题? 多个线程操作同一 ...
- java线程安全问题原因及解决办法
1.为什么会出现线程安全问题 计算机系统资源分配的单位为进程,同一个进程中允许多个线程并发执行,并且多个线程会共享进程范围内的资源:例如内存地址.当多个线程并发访问同一个内存地址并且内存地址保存的值是 ...
- java 线程安全问题_java线程安全问题原因及解决办法
1.为什么会出现线程安全问题 计算机系统资源分配的单位为进程,同一个进程中允许多个线程并发执行,并且多个线程会共享进程范围内的资源:例如内存地址.当多个线程并发访问同一个内存地址并且内存地址保存的值是 ...
- Java 线程安全问题及线程锁(读书笔记)
多线程安全问题: 首先整理多线程同步的知识点,开头肯定是要先探讨探讨多线程安全的问题.那么嘛叫线程安全问题呢? 答: 我们知道Jvm虚拟机的设计中线程的执行是抢占式的,线程的执行时间是由底层系统决定的 ...
- java线程安全问题之静态变量、实例变量、局部变量
转载 java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编程实践>中所说: 写道 给线程安全下定义比较困难.存在很多种定 ...
- java 线程安全问题之静态变量、实例变量、局部变量
2019独角兽企业重金招聘Python工程师标准>>> java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编 ...
- JAVA线程安全问题
卖票的过程中出现了线程安全问题,有重票和错票的问题.为什么会出现这个问题?当某个线程在操作卖票的过程中尚未完成卖票操作,其他线程也参与进来操作卖票,就会出现线程安全问题,(主要是共享数据(nums)的 ...
- Java 线程安全问题及解决
线程安全 我们先来说说线程安全问题是什么? 线程安全问题其实就是多个线程同时访问一个资源时,会导致程序运行结果并不是想看到的结果.所以我们建议在没有使用解决方案的时候尽量只读不写 首先我们写了一个简单 ...
- java 线程安全的原因_java的多线程:java安全问题产生的原因与JMM的关系
一.多线程产生安全问题 1.Java内存模型 共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见. 从抽象的角度来看,JMM定义了线程和主内存 ...
最新文章
- 【杂谈】WebService是什么?
- Nature出炉「中国博士生图鉴」:过半学生想换领域换导师,40%学生受抑郁、焦虑困扰...
- C++随笔——虚拟继承
- STM32 RTC实时时钟
- Python规范:提高可读性
- box-shadow技巧分享
- 在Window下编译OpenH323
- c语言中二维数组中产生随机数,C语言中是如何进行随机数生成的[多图]
- ssms没有弹出服务器验证_使用SSMS扫描和查找SQL Server数据库的潜在安全漏洞
- UVALive - 6864 Strange Antennas 扫描线
- python有什么用-学了Python一般可以用来干什么?老男孩教育告诉你!
- 监听程序当前无法识别连接描述符中请求的服务_Linux I/O复用中select poll epoll模型的介绍及其优缺点的比较...
- linux otl oracle数据库连接例子
- 使用技巧-输出彩色TIF格式分类结果
- 【ERROR】Error: Error trying to upgrade business network. Error: No valid responses from any peers.
- h5直接播放amr文件
- 数据组,请求组,职责,用户关系
- consul 变更端口
- 常用的几款3D软件介绍
- http请求报错SSLError: HTTPSConnectionPool:Max retries exceeded with url