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. 1.volatile关键字 内存可见性

    Java JUC 简介 在 Java 5.0 提供了 java.util.concurrent (简称JUC )包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括 ...

  2. 二、volatile关键字 - 内存可见性

    1.内存可见性 ​ (程序在运行时,jvm会为每一个执行任务的线程都分配一个独立的缓存,用于提高效率) ​ 我觉得可以这样来理解: ​ 内存:啥是内存?就是可以理解成电脑当中的内存条,程序创建个变量, ...

  3. Volatile 关键字 内存可见性

    1.问题引入 实现线程: public class ThreadDemo implements Runnable { private boolean flag = false; @Override p ...

  4. java多线程 -- volatile 关键字 内存 可见性

    内存可见性(Memory Visibility) 1 内存可见性(Memory Visibility)是指当某个线程正在使用对象状态而另一个线程在同时修改该状态,需要确保当一个线程修改了对象状态后,其 ...

  5. JUC 并发编程--05, Volatile关键字特性: 可见性, 不保证原子性,禁止指令重排, 代码证明过程. CAS了解么 , ABA怎么解决, 手写自旋锁和死锁

    问: 了解volatile关键字么? 答: 他是java 的关键字, 保证可见性, 不保证原子性, 禁止指令重排 问: 你说的这三个特性, 能写代码证明么? 答: .... 问: 听说过 CAS么 他 ...

  6. 1. volatale 关键字 -内存可见性

    package com.gf.demo01; /** * 一.volatile 关键字:但多个线程进行操作共享数据时,可以保证内存中数据可见性. * */ public class TestVolat ...

  7. 全面理解Java内存模型(JMM)及volatile关键字(转载)

    关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java类加载器(ClassLoad ...

  8. 全面理解Java内存模型(JMM)及volatile关键字

    [版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/72772461 出自[zejian ...

  9. Java并发编程:JMM (Java内存模型) 以及与volatile关键字详解

    目录 计算机系统的一致性 Java内存模型 内存模型的3个重要特征 原子性 可见性 有序性 指令重排序 volatile关键字 保证可见性和防止指令重排 不能保证原子性 计算机系统的一致性 在现代计算 ...

随机推荐

  1. Extjs4 store load 有中文字符提交后台乱码解决方法

    一.在load提交时对字符串进行decode处理. {name : encodeURIComponent(value)} 然后在后端进行反编码 java.net.URLDecoder.decode(n ...

  2. 转载--Json转换

    JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.XML也是一种数据交换格式,为什么没 ...

  3. Python生成语音

    from aip import AipSpeech # 利用百度语音合成音频文件 """ 你的 APPID AK SK """ APP_ID ...

  4. (一)认识Sass和Compass

    第一章 Sass和Compass让样式表重焕青春 // 内容概要// 开始学习Sass和动态样式表// 用Sass更高效地写样式表// Compass简介// 用Compass迎接工程实践中的样式挑战 ...

  5. Code Signal_练习题_Knapsack Light

    You found two items in a treasure chest! The first item weighs weight1 and is worth value1, and the ...

  6. PHP 绘制验证码

    使用PHP绘制验证码  可直接使用 // 验证码 <?php $checkCode = ""; for ($i=0; $i < 4; $i++) { // 十进制转换为 ...

  7. JS 实现四舍五入保留两位小数并且添加千位分隔符

    var a = "-123456789.078";a = (Math.round(a * 100) / 100).toFixed(2).toString().replace(/(\ ...

  8. JS中判断数据类型的几种方法

    1⃣️首先我们来了解一下js中的数据类型 1.基本数据类型:Undefined.Null.Boolean.Number.String(值类型) 2.复杂数据类型:Object(引用类型) (值类型和引 ...

  9. js的style.display小问题

    在元素添加class样式隐藏display:none; 使用console.log(xx.style.display);//空值

  10. PeopleSoft面试题(服务器相关)

    如何配置app服务器与web服务器的负载均衡?请详细说明. App Server: 在配置App Server负载均衡时候,通过webserv目录下的configuration.properties文 ...