volatile 作用】的更多相关文章

先贴一下 volatile 的作用定义 如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的 首先问题就来了,一个共享变量再被volatile修饰过后,怎么被确保所有线程看到的这个变量的值是一致的的呢,也就是说volatile是如何来保证可见性的呢? 在X86处理器下通过工具获取JIT编译器生成的汇编指令来查看对volatile进行写操作时,CPU会做什么事情. private volatile instance = new Singleton(); 转…
在工作一年多之后,java程序员都会了解到volatile 这个修饰符, 其在多线程环境下解决了long/double写操作的原子性.基本变量的可见性.通过建立内存屏障保证指令有序性 那么在哪些Java类中使用到了volatile? 首先考虑哪些类要去保证线程安全,其实有很多类的,只要这个类包含私有属性,且没有final修饰. 可以考虑到的有线程. 集合.IO.字符串相关.包装类.网络编程等 Thread.threadStatus 线程状态 Thread.parkBlocker Thread.b…
volatile使用场景:线程间共享变量需要使用 volatile 关键字标记,确保线程能够读取到更新后的最新变量值. volatile关键字的目的是告诉虚拟机: 1.每次访问变量时,总是获取主内存的最新值. 2.每次修改变量后,立刻会写到主内存. 所以volatile解决的是可见性的问题: 1.当一个线程修改了某个共享变量的值,其他线程能够立刻看到修改之后的值. 流程图 如下:…
volatile作用总结: 1. 强制线程从公共内存中取得变量的值,而不是从线程的私有的本地内存中,volatile修饰的变量不具有原子性(修改一个变量的值不能同步). 2. 保证volatile修饰的变量在被一个线程修改后,会被强制立即刷新到主存(可见性),其他线程如果有该变量的缓存行,会被设置为无效. 3. 禁止指令重排(有序性). a.happen-before b.编译器在生成字节码时, 会在指令序列中插入内存屏障,会多出一个 lock 前缀指令 内存屏障是一组处理器指令,解决禁止指令重…
黑马程序员:Java培训.Android培训.iOS培训..Net培训 JAVA线程-内存模型和volatile详解 一.单核内存模型 1.程序运行时,将临时数据存放到Cache中 2.将CPU计算所需要的数据从Cache中拷贝一份到H Cache中 3.CPU直接从H Cache中读取数据进行计算 4.CPU将计算的结果写入H Cache中 5.H Cache将最新的结果值涮入Cache中(何时写入不确定) 6.将Cache中结果数据写回程序(如果有需要,例如文件.数据库) 需要H Cache…
参考资料: http://www.google.com/cse?sa.x=0&sa.y=0&cx=010284515138798138769%3Aajbqkpwaapm&ie=UTF-8&q=volatile#gsc.tab=0&gsc.q=volatile&gsc.page=1 1.最完整说明Volatile作用的文章: http://ifeve.com/jmm-faq-volatile/ 2.说明了volatile的使用场景的文档: http://www…
java多线程系列(五)---synchronized ReentrantLock volatile Atomic 原理分析 前言:如有不正确的地方,还望指正. 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 java多线程系列(三)之等待通知机制 java多线程系列(四)之ReentrantLock的使用 Synchronized 原理 synchronized关键字是通过字节码指令来实现的 synchronized关键…
前言 对于ThreadLocal.Volatile.synchronized.Atomic这四个关键字,我想一提及到大家肯定都想到的是解决在多线程并发环境下资源的共享问题,但是要细说每一个的特点.区别.应用场景.内部实现等,却可能模糊不清,说不出个所以然来,所以,本文就对这几个关键字做一些作用.特点.实现上的讲解. 1.Atomic 作用 对于原子操作类,Java的concurrent并发包中主要为我们提供了这么几个常用的:AtomicInteger.AtomicLong.AtomicBoole…
一.前言       最近去成都玩了一圈,整体感觉还不错,辞职以后工作找的也很顺利,随着年龄增加自己也考虑定居和个人长期发展的问题,反正乱七八糟的事,总之需要好好屡屡思路,不能那么着急下定论,当然我对下份工作也是有所期望的,不扯了开始我们今天主题吧. 二.Java的内存模型     Java内存模型规定所有的变量都存在主内存当中,每条线程都有自己的工作内存,线程的工作内存保存了被该线程使用的变量的主内存副本拷贝,线程对变量的所有操作都在内存中进行,而不能直接读写主内存中的变量.不同的线程之间无法…
用代码描述这么一个场景,在main方法中开启两个线程,其中一个线程t1往list里循环添加元素,另一个线程t2监听list中的size,当size等于5时,t2线程结束,t1线程继续执行,直到循环结束,试着想一想,以下代码能不能实现: package com.fanjf.thread; import java.util.ArrayList; import java.util.List; public class Mycontainer { static List<Integer> intege…