1、JUC--volatile 关键字-内存可见性
Java JUC简介
在 Java 5.0 提供了 java.util.concurrent (简称
JUC )包,在此包中增加了在并发编程中很常用
的实用工具类,用于定义类似于线程的自定义子
系统,包括线程池、异步 IO 和轻量级任务框架。
提供可调的、灵活的线程池。还提供了设计用于
多线程上下文中的 Collection 实现等
线程实例:
public class TestVoatile { public static void main(String[] args) {
ThreadDemo td = new ThreadDemo(); new Thread(td).start();
while(true){
if(td.isFlag()){
System.out.println("已启动");
break;
}
}
} } class ThreadDemo implements Runnable{ private boolean flag = false; public boolean isFlag(){
return flag;
} public void setFlag(boolean flag){
this.flag = flag;
} @Override
public void run() {
try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = true;
System.out.println("flag:" + isFlag());
}
}
此时的main函数中是有两个线程的执行结果如下图所示:
此时执行的是第一个线程
while循环并没有执行
此时设计内存可见性的问题
共享数据
同时存在缓存的问题
此时线程1和main线程都有自己独立的缓存
对于线程1来说首先需要要调用主存中的值,首先需要读取值到线程1中
线程1读取值之后,并且要向主存中进行改值
此时main线程到来,取出主存中的值
所以此时main线程中的flag=false
但是此时并没有及时进行对主存进行修改值
此时使用线程睡眠:
ThreadDemo td = new ThreadDemo(); new Thread(td).start();
try {
Thread.sleep();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} while(true){
if(td.isFlag()){
System.out.println("已启动");
break;
}
}
}
内存可见性问题
多个线程操作共享数据问题,彼此不可见
可以使用同步锁
在取值时进行刷新数据
public static void main(String[] args) {
ThreadDemo td = new ThreadDemo();
new Thread(td).start();
while(true){
synchronized (td) {
if(td.isFlag()){
System.out.println("已启动");
break;
}
}
}
}
此时使用同步锁机制,效率极低
每次都会进行判断
如果一个正在使用数据,另一个线程就会等待
效率大大降低
volatile关键字:
当多个线程进行操作共享数据时,可以保证内存中的数据是可见的
可以理解成直接对主存中的数据进行操作
public class TestVoatile { public static void main(String[] args) {
ThreadDemo td = new ThreadDemo();
new Thread(td).start(); while(true){
if(td.isFlag()){
System.out.println("已启动");
break;
}
}
}
}
class ThreadDemo implements Runnable{ private volatile boolean flag = false; public boolean isFlag(){
return flag;
} public void setFlag(boolean flag){
this.flag = flag;
} @Override
public void run() {
try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = true; System.out.println("flag:" + isFlag());
}
}
相对于synchronized:
Java 提供了一种稍弱的同步机制,即 volatile 变
量,用来确保将变量的更新操作通知到其他线程。
可以将 volatile 看做一个轻量级的锁
前者是一种轻量级的同部策略
1、volatile不具有互斥性(synchronized具有锁性值,只能有一个线程访问)
2、volatile不具有原子性
1、JUC--volatile 关键字-内存可见性的更多相关文章
- 1.volatile关键字 内存可见性
Java JUC 简介 在 Java 5.0 提供了 java.util.concurrent (简称JUC )包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括 ...
- 二、volatile关键字 - 内存可见性
1.内存可见性 (程序在运行时,jvm会为每一个执行任务的线程都分配一个独立的缓存,用于提高效率) 我觉得可以这样来理解: 内存:啥是内存?就是可以理解成电脑当中的内存条,程序创建个变量, ...
- Volatile 关键字 内存可见性
1.问题引入 实现线程: public class ThreadDemo implements Runnable { private boolean flag = false; @Override p ...
- java多线程 -- volatile 关键字 内存 可见性
内存可见性(Memory Visibility) 1 内存可见性(Memory Visibility)是指当某个线程正在使用对象状态而另一个线程在同时修改该状态,需要确保当一个线程修改了对象状态后,其 ...
- JUC 并发编程--05, Volatile关键字特性: 可见性, 不保证原子性,禁止指令重排, 代码证明过程. CAS了解么 , ABA怎么解决, 手写自旋锁和死锁
问: 了解volatile关键字么? 答: 他是java 的关键字, 保证可见性, 不保证原子性, 禁止指令重排 问: 你说的这三个特性, 能写代码证明么? 答: .... 问: 听说过 CAS么 他 ...
- 1. volatale 关键字 -内存可见性
package com.gf.demo01; /** * 一.volatile 关键字:但多个线程进行操作共享数据时,可以保证内存中数据可见性. * */ public class TestVolat ...
- 全面理解Java内存模型(JMM)及volatile关键字(转载)
关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java类加载器(ClassLoad ...
- 全面理解Java内存模型(JMM)及volatile关键字
[版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/72772461 出自[zejian ...
- Java并发编程:JMM (Java内存模型) 以及与volatile关键字详解
目录 计算机系统的一致性 Java内存模型 内存模型的3个重要特征 原子性 可见性 有序性 指令重排序 volatile关键字 保证可见性和防止指令重排 不能保证原子性 计算机系统的一致性 在现代计算 ...
随机推荐
- 数据结构与算法--最短路径之Dijkstra算法
数据结构与算法--最短路径之Dijkstra算法 加权图中,我们很可能关心这样一个问题:从一个顶点到另一个顶点成本最小的路径.比如从成都到北京,途中还有好多城市,如何规划路线,能使总路程最小:或者我们 ...
- 了解java虚拟机—串行回收器(6)
串行回收器 串行回收器只有一个工作线程,串行回收器可以在新生代和老年代使用,根据作用于不同的堆和空间,分为新生代串行回收器和老年代串行回收器. 1.新生代串行回收器 串行收集器是所有垃圾回收器中最古老 ...
- Could not initialize plugin: interface org.mockito.plugins.MockMaker
IDE:Idea 添加依赖 <dependency> <groupId>net.bytebuddy</groupId> <artifactId>byte ...
- 【15】模板方法模式(Template Method)
一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等.在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它.例如简 ...
- HDU5840(SummerTrainingDay08-B 树链剖分+分块)
This world need more Zhu Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- 设计模式(15)--Interpreter(解释器模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解 ...
- 原生css 中变量的使用
前两天看到阮大神的一篇在css中使用变量的文章,整理了一下. 这个重要的 CSS 新功能,所有主要浏览器已经都支持了.本文全面介绍如何使用它,你会发现原生 CSS 从此变得异常强大. 一.变量的声明 ...
- 关于ArrayAdapter的getCount()的方法会造成空指针异常的分析
在继承了ArrayAdapter重新getCount()的方法后,比如 public int getCount() { return 3; } 若在活动中调用setAdapter()的方法前,List ...
- ionic之angular1.X缓存问题解决
众所周知ionic的angular1.X解决缓存的问题有: 1.在app.js里面修改:默认是true,设置了缓存 .state('tab.msg-main', { url: '/msg-main', ...
- Android逆向 破解第一个Android程序
这节正式开始破解编写的第一个Android工程,打开Android Killer,把第一节自己编写的Android apk拖入Android Killer. PS: 如果Android Killer不 ...