Java volatile关键字小结
public class Test { public static void main(String[] args){ } } /* 12.3 Java内存模型 Java内存模型定义了线程与主内存之间的抽象关系: 1.共享变量存储于主内存之中,每个线程都可以访问 2.每个线程都有私有的工作内存 3.工作内存只存储该线程对共享变量的副本 4.线程不能直接操作主内存,只有先操作了工作内存之后才能写入主内存 5.工作内存是一种抽象的概念,涵盖了缓存、寄存器、编译优化以及硬件 */ /* 13.1 并发编程的三个重要特性 原子性:一次操作或者多次操作,要么所有的惭怍全部都得到了执行,并且不受任何 因素的干扰而中断,要么所欲的操作都不执行 可见性:当一个线程对共享变量进行了修改,那么另外的线程可以立即看到。 有序性:程序代码在执行过程中的先后顺序。在多线成的情况下,如果有序性得不到 保障,其结果是灾难性的。 13.2.1 JMM与原子性 y=x; 1.执行线程从主内存读取x的值(如果x已经存在与执行线程的工作内存中,则直接获取) 然后将其存入当前线程的工作内存中。 2.在执行线程的工作内存中修改y的值为x。 结论: 1.多个原子性的操作在一起就不再是原子性操作了 2.简单的读取与赋值操作是原子性的,将一个变量赋给另一个变量不是原子的 3.JMM只保证了基本读取和赋值的原子性操作 */ /* 13.2.2 JMM与可见性 Java三种方式保证可见性: 1.使用关键字volatile,读,写两个方面 2.使用关键字synchronized,同一时刻只有一个线程获得锁,且释放锁之前, 会将对变量的修改刷新到主内存中 3.通过JUC提供的显式锁Lock */ /* 13.2.3 JMM与有序性 方案同上。 JMM具备一些天生的有序性规则,不需要任何同步手段就能够保证有序性,这个规则被称为 Happens-before原则。如果两个操作的执行次序无法从happens-before原则推导出来, 那么它们就无法保证有序性,也就是说JVM或者处理器可以任意对它们进行重排序出来。 happens-before原则: 1.程序次序原则:一个线程内,代码按照编写时的次序来执行,编写在后面的操作发生 在编写在前面的操作之后。(JVM还是可能对程序代码进行重排序,只要确保一个 线程内结果一致即可) 2.锁定规则:一个unlock操作要先行发生于对同一个锁的lock操作。 3.volatile变量原则:对一个变量的写操作要早与对这个变量的读操作。 4.传递规则:如果操作a先于操作b,而操作b先与操作c,则可以得出操作a肯定先于 操作c。happens-before原则具有传递性 5.线程启动规则:Thread对象的start()方法先行于发生对该线程的任何动作。 6.线程中断规则:对线程执行interrupt()方法肯定优先与捕获到中断信号。 7.线程终结原则:线程任务的执行、逻辑单元执行肯定要发生于线程死亡之前 8.一个对象初始化的完成先于finalize()方法之前。 */ /* 13.3.1 volatile关键字语义 被volatile修饰的变量有: 1.保证了不同线程之间对共享变量操作时的可见性 2.进制对指令进行重排序操作 (1)理解volatile保证可见性 (2)理解volatile保证顺序性 (3)理解volatile不保证原子性 我觉得作者在将volatile不保证原子性时,举得例子前后都是矛盾的,前面一个例子都说了 volatile在工作内存中对变量进行了修改后,会立即刷新到主内存中,导致其他工作内存中 的备份失效。但是这个例子时又说线程B工作内存中为i执行了加1的操作,但是未刷新到至主 内存中,这不是在搞笑么。这个例子又用到了后面写的类,我想做个实验都做不成,唉! */ /* 13.3.3 volatile的使用场景 (1)开关控制利用可见性的特点 class ThreadConseale extends Thread{ private volatile boolean started = true; public void run(){ while(started){ //do work } } public void shutdown(){ this.started=false; } } (2)状态标记利用顺序性特点 (3)Singleton设计模式的double-check也是利用顺序性特点。 */
《Java高并发编程详解》笔记
Java volatile关键字小结的更多相关文章
- [Java并发编程(三)] Java volatile 关键字介绍
[Java并发编程(三)] Java volatile 关键字介绍 摘要 Java volatile 关键字是用来标记 Java 变量,并表示变量 "存储于主内存中" .更准确的说 ...
- 13、Java并发性和多线程-Java Volatile关键字
以下内容转自http://tutorials.jenkov.com/java-concurrency/volatile.html(使用谷歌翻译): Java volatile关键字用于将Java变量标 ...
- Java Volatile关键字(转)
出处: Java Volatile关键字 Java的volatile关键字用于标记一个变量“应当存储在主存”.更确切地说,每次读取volatile变量,都应该从主存读取,而不是从CPU缓存读取.每次 ...
- Java volatile 关键字底层实现原理解析
本文转载自Java volatile 关键字底层实现原理解析 导语 在Java多线程并发编程中,volatile关键词扮演着重要角色,它是轻量级的synchronized,在多处理器开发中保证了共享变 ...
- Java volatile关键字详解
Java volatile关键字详解 volatile是java中的一个关键字,用于修饰变量.被此关键修饰的变量可以禁止对此变量操作的指令进行重排,还有保持内存的可见性. 简言之它的作用就是: 禁止指 ...
- Java Volatile关键字
在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写. 这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量 ...
- 从根源上解析 Java volatile 关键字的实现
1.解析概览 内存模型的相关概念 并发编程中的三个概念 Java内存模型 深入剖析Volatile关键字 使用volatile关键字的场景 2.内存模型的相关概念 缓存一致性问题.通常称这种被多个线程 ...
- java volatile关键字解析
volatile是什么 volatile在java语言中是一个关键字,用于修饰变量.被volatile修饰的变量后,表示这个变量在不同线程中是共享,编译器与运行时都会注意到这个变量是共享的,因此不会对 ...
- Java Volatile关键字 以及long,double在多线程中的应用
概念: volatile关键字,官方解释:volatile可以保证可见性.顺序性.一致性. 可见性:volatile修饰的对象在加载时会告知JVM,对象在CPU的缓存上对多个线程是同时可见的. 顺序性 ...
随机推荐
- SQL Server修改标识列方法(备忘)
原文:SQL Server修改标识列方法(备忘) SQL Server修改标识列方法 ----允许对系统表进行更新 exec sp_configure 'allow updates',1 reconf ...
- 微信小程序把玩(十九)radio组件
原文:微信小程序把玩(十九)radio组件 radio组件为单选组件与radio-group组合使用,使用方式和checkbox没啥区别 主要属性: wxml <!--设置监听器,当点击radi ...
- WPF使用Font-Awesome字体
官方网站:https://fontawesome.com/ 使用教程: 学习WPF——使用Font-Awesome图标字体 - liulun - 博客园https://www.cnblogs.com/ ...
- wlan和wifi的区别是什么?
首先我们简单介绍下WLAN无线上网,其全称是:Wireless Local Area Networks,中文解释为:无线局域网络,是一种利用射频(Radio Frequency RF)技术进行据传输的 ...
- vc++的学习目的
vc++支持多种编程方式,从结构化的编程,面向对象编程,泛型编程,com组件编程. 我想学习vc++的原因是它更接近底层.非常的高效,希望之后用它写出非常简洁高效的代码.
- win7 docker安装文件及安装问题
最近在玩爬虫,需要装docker,但是官网对于win7版本,只支持docker tool box,在官网找了半天才找到安装包,特此上传百度网盘,方便各位下载 链接:https://pan.baidu. ...
- 曹工说Tomcat1:从XML解析说起
一.前言 第一次被人喊曹工,我相当诧异,那是有点久的事情了,楼主13年校招进华为,14年在东莞出差,给东莞移动的通信设备进行版本更新.他们那边的一个小伙子来接我的时候,这么叫我的,刚听到的时候,心里一 ...
- sails项目创建与常用基础操作总结
1.全局安装: cnpm install -g sails 2.创建项目: sails new sails_shop ,选2 或者: sails new sails_shop --fast ,选2 c ...
- Android短视频中如何实现720P磨皮美颜录制?
视频中磨皮.美颜功能已成为刚需,那么如何在Android短视频中实现720P磨皮美颜录制?本篇文章中,网易云信资深开发工程师将向大家介绍具体的操作方法. 相关阅读推荐 <短视频技术详解:Andr ...
- SQL Server温故系列(4):SQL 查询之集合运算 & 聚合函数
1.集合运算 1.1.并集运算 UNION 1.2.差集运算 EXCEPT 1.3.交集运算 INTERSECT 1.4.集合运算小结 2.聚合函数 2.1.求行数函数 COUNT 2.2.求和函数 ...