java线程--volatile实现可见性
volatile关键字:
1)能够保证volatile变量的可见性
2)不能保证volatile变量复杂操作的原子性。
volatile如何实现内存可见性:
深入来说:通过加入内存屏障和禁止重排序优化来实现的。
1)对volatile变量执行写操作时,会在写操作后加入一条store屏障指令
2)对volatile变量执行读操作时,会在读操作前加入一条load屏障执行
通俗来讲:volatile变量在每次被线程访问时,都强迫从主内存中重读该变量的值,而当该变量发生变化时,又会强迫线程将最新的值刷新到主内存。
这样任何时刻,不同的线程总能看到该变量的最新值。
线程写volatile变量的过程:
1,改变线程工作内存中volatile变量副本的值
2,将改变后的副本从工作内存刷新到主内存。
线程读volatile变量过程:
1)从主内存读取volatile变量的最新值到线程工作内存中
2)从工作内存读取volatile变量的副本
volatile不能保证volatile变量符合操作的原子性:
pirvate int number=0; number++; 不是原子操作
number++不是原子操作,它实际上包含三步:
1)读取number的值
2)将number的值加1
3)写入最新的number的值。
synchronized(this)
{
number++;
}
加入synchronized,变为原子操作(number++分解出来的三步操作,只能被一个线程执行完后才能被另一个线程执行,而不能几个线程同时交叉执行这
三步操作,这就实现了原子性)。
private volatile int number=0;
变为volatile变量,无法保证原子性。
java线程--volatile实现可见性的更多相关文章
- 1  Java线程的内存可见性
		
Java内存的可见性 可见性: 一个线程对共享变量的修改,能够及时被其它线程看到 共享变量: 如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量 Java内存模型(JM ...
 - java 线程基本概念 可见性 同步
		
开发高性能并发应用不是一件容易的事情.这类应用的例子包括高性能Web服务器.游戏服务器和搜索引擎爬虫等.这样的应用可能需要同时处理成千上万个请求.对于这样的应用,一般采用多线程或事件驱动的架构.对于J ...
 - Java线程volatile(二)
		
volatile:使变量在多个线程中可见 在java 中每个线程都会有一块工作内存区,其中存放着所有线程共享的主内存中变量的拷贝.当线程执行时,在自己的工作内存区操作这些变量,为了存取一个共享的变量, ...
 - Java线程-volatile不能保证原子性
		
下面是一共通过volatile实现原子性的例子: 通过建立100个线程,计算number这个变量最后的结果. package com.Sychronized; public class Volatil ...
 - java线程-synchronized实现可见性代码
		
以下是一个普通线程代码: package com.Sychronized; public class SychronizedDemo { //共享变量 private boolean ready=fa ...
 - Java 线程 — synchronized、volatile、锁
		
线程同步基础 synchronized 和volatile是Java线程同步的基础. synchronized 将临界区的内容上锁,同一时刻只有一个进程能访问该临界区代码 使用的是内置锁,锁一个时刻只 ...
 - 深入理解java虚拟机(6)---内存模型与线程 & Volatile
		
其实关于线程的使用,之前已经写过博客讲解过这部分的内容: http://www.cnblogs.com/deman/category/621531.html JVM里面关于多线程的部分,主要是多线程是 ...
 - Java线程(二):线程同步synchronized和volatile
		
上篇通过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么会产生这样的结果呢,因为建立的Count对象是线程 ...
 - java中volatile不能保证线程安全
		
今天打了打代码研究了一下java的volatile关键字到底能不能保证线程安全,经过实践,volatile是不能保证线程安全的,它只是保证了数据的可见性,不会再缓存,每个线程都是从主存中读到的数据,而 ...
 
随机推荐
- USACO 2017 FEB Platinum mincross 可持久化线段树
			
题意 上下有两个位置分别对应的序列A.B,长度为n,两序列为n的一个排列.当Ai == Bj时,上下会连一条边.你可以选择序列A或者序列B进行旋转任意K步,如 3 4 1 5 2 旋转两步为 5 2 ...
 - Failed to read auto-increment value from storage engine错误的处理方法
			
在进行数据的插入时,系统提示Failed to read auto-increment value from storage engine(从存储引擎读取自增字段失败)错误,经查阅资料,解决方法如下: ...
 - Codeforces Beta Round #6 (Div. 2 Only) B. President's Office 水题
			
B. President's Office 题目连接: http://codeforces.com/contest/6/problem/B Description President of Berla ...
 - DAC calibrates 4- to 20-mA output current
			
Industrial controls make heavy use of 4- to 20-mA current loops to transmit process measurements bec ...
 - J-LINK序列号修改
			
打开J-LINK COMMANDER中输入 exec setsn=xxxxxxxx 即可
 - 初探Delphi中的插件编程
			
前言 我写Delphi程序是从MIS系统入门的,开始尝试子系统划分的时候采用的是MDI窗体的结构.随着系统功能的扩充,不断有新的子系统加入系统中,单个工程会变得非常大,每次做一点修改都要重新编译,单个 ...
 - Spring工具类ToStringBuilder用法简介
			
比如说我们需要打印某个方法的User参数对象 package test; /** * * @author zhengtian * @time 2012-6-28 */ public class Use ...
 - JS字符串转base64格式
			
var Base64 = { // private property _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx ...
 - 水平ListView
			
/* * HorizontalListView.java v1.5 * * * The MIT License * Copyright (c) 2011 Paul Soucy (paul@dev-sm ...
 - Java垃圾回收精粹 — Part2
			
Java垃圾回收精粹分4个部分,本篇是第2部分.在第2部分里介绍了Hotspot中的堆结构.对象分配以及次要回收. Hotspot中的堆结构 理解不同的收集器的工作方式,是探讨Java堆结构如何支持分 ...