一、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就能保证变量的线程安全问题:

  1. 运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。
  2. 变量不需要与其他状态变量共同参与不变约束。

volatile关键字和Java线程安全问题相关推荐

  1. 关于如何解决java线程安全问题?很重要? 快拿小本本记下来!

    关于如何解决java线程安全问题?很重要? 快拿小本本记下来! 线程安全问题 什么是线程安全问题? 线程同步 同步代码块 同步方法 lock显示锁 线程安全问题 什么是线程安全问题? 多个线程操作同一 ...

  2. java线程安全问题原因及解决办法

    1.为什么会出现线程安全问题 计算机系统资源分配的单位为进程,同一个进程中允许多个线程并发执行,并且多个线程会共享进程范围内的资源:例如内存地址.当多个线程并发访问同一个内存地址并且内存地址保存的值是 ...

  3. java 线程安全问题_java线程安全问题原因及解决办法

    1.为什么会出现线程安全问题 计算机系统资源分配的单位为进程,同一个进程中允许多个线程并发执行,并且多个线程会共享进程范围内的资源:例如内存地址.当多个线程并发访问同一个内存地址并且内存地址保存的值是 ...

  4. Java 线程安全问题及线程锁(读书笔记)

    多线程安全问题: 首先整理多线程同步的知识点,开头肯定是要先探讨探讨多线程安全的问题.那么嘛叫线程安全问题呢? 答: 我们知道Jvm虚拟机的设计中线程的执行是抢占式的,线程的执行时间是由底层系统决定的 ...

  5. java线程安全问题之静态变量、实例变量、局部变量

    转载 java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编程实践>中所说: 写道 给线程安全下定义比较困难.存在很多种定 ...

  6. java 线程安全问题之静态变量、实例变量、局部变量

    2019独角兽企业重金招聘Python工程师标准>>> java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编 ...

  7. JAVA线程安全问题

    卖票的过程中出现了线程安全问题,有重票和错票的问题.为什么会出现这个问题?当某个线程在操作卖票的过程中尚未完成卖票操作,其他线程也参与进来操作卖票,就会出现线程安全问题,(主要是共享数据(nums)的 ...

  8. Java 线程安全问题及解决

    线程安全 我们先来说说线程安全问题是什么? 线程安全问题其实就是多个线程同时访问一个资源时,会导致程序运行结果并不是想看到的结果.所以我们建议在没有使用解决方案的时候尽量只读不写 首先我们写了一个简单 ...

  9. java 线程安全的原因_java的多线程:java安全问题产生的原因与JMM的关系

    一.多线程产生安全问题 1.Java内存模型 共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见. 从抽象的角度来看,JMM定义了线程和主内存 ...

最新文章

  1. 【杂谈】WebService是什么?
  2. Nature出炉「中国博士生图鉴」:过半学生想换领域换导师,40%学生受抑郁、焦虑困扰...
  3. C++随笔——虚拟继承
  4. STM32 RTC实时时钟
  5. Python规范:提高可读性
  6. box-shadow技巧分享
  7. 在Window下编译OpenH323
  8. c语言中二维数组中产生随机数,C语言中是如何进行随机数生成的[多图]
  9. ssms没有弹出服务器验证_使用SSMS扫描和查找SQL Server数据库的潜在安全漏洞
  10. UVALive - 6864 Strange Antennas 扫描线
  11. python有什么用-学了Python一般可以用来干什么?老男孩教育告诉你!
  12. 监听程序当前无法识别连接描述符中请求的服务_Linux I/O复用中select poll epoll模型的介绍及其优缺点的比较...
  13. linux otl oracle数据库连接例子
  14. 使用技巧-输出彩色TIF格式分类结果
  15. 【ERROR】Error: Error trying to upgrade business network. Error: No valid responses from any peers.
  16. h5直接播放amr文件
  17. 数据组,请求组,职责,用户关系
  18. consul 变更端口
  19. 常用的几款3D软件介绍
  20. http请求报错SSLError: HTTPSConnectionPool:Max retries exceeded with url

热门文章

  1. Mac OS X搭建C#开发环境
  2. 【SoftwareTestingHomework2】--3013218086--
  3. PHP下获取上个月、下个月、本月的日期(strtotime,date)
  4. Map 3D中通过程序删除图层及数据源
  5. 【Python笔记】集合
  6. 脚本_vnote同步到hexo步骤[博]
  7. 中低频量化交易策略研发05_推进分析
  8. 数据分析、python速成班?包就业?扒一扒数据行业黑幕
  9. 在开发过程中调试报表插件详细教程
  10. Flex Java Servlet 实现简单图片编辑