多线程之volatile关键字(五)】的更多相关文章

开始全文之前,先铺垫一下jvm基础知识以及线程栈: JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean.char.byte.short.int.long.float.double).部分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址.       接下来说说volatile: 用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最…
关键字volatile的主要作用是使变量在多个线程间可见. 1.关键字volatile与死循环 如果不是在多继承的情况下,使用继承Thread类和实现Runnable接口在取得程序运行的结果上并没有什么太大的区别.如果一旦出现“多继承”的情况,则用实现Runnable接口的方式来处理多线程的问题就是很有必要的. 下面我们用实现Runnable接口的的方式来理解多线程的使用,也看实验volatile关键字在并发情况下的一些特性. 1.1创建一个PrintString类: package edu.y…
public class ThreadVolatile extends Thread { public boolean flag=true; @Override public void run() { System.out.println("子线程begin......"); while(flag){} System.out.println("子线程end....."); } public void setFlag(boolean flag){ this.flag=…
一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空间???线程执行时,先把变量从主内存读取到线程自己的本地内存空间,然后再对该变量进行操作 ②对该变量操作完后,在某个时间再把变量刷新回主内存 关于JAVA内存模型,更详细的可参考: 深入理解Java内存模型(一)——基础 因此,就存在内存可见性问题,看一个示例程序:(摘自书上) public cla…
一内存模型的相关概念 二并发编程中的三个概念 三Java内存模型 四深入剖析volatile关键字 五使用volatile关键字的场景 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机. volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,因此在讲述vo…
本文目录 从多线程交替打印A和B开始 Java 内存模型中的可见性.原子性和有序性 Volatile原理 volatile的特性 volatile happens-before规则 volatile 内存语义 volatile 内存语义的实现 CPU对于Volatile的支持 缓存一致性协议 工作内存(本地内存)并不存在 总结 -参考资料 从多线程交替打印A和B开始 面试中经常会有一道多线程交替打印A和B的问题,可以通过使用Lock和一个共享变量来完成这一操作,代码如下,其中使用num来决定当前…
目录 轻量级同步机制:volative关键字 volative的作用 volatile非原子特性 volatile与synchronized比较 常用原子类进行自增自减操作 CAS 使用CAS原理实现线程安全计数器 CAS中的ABA问题 原子变量类 使用AtomicLong定义计数器 轻量级同步机制:volative关键字 volative的作用 关键作用是使变量在多个线程之间可见 public class VolativeText { public static void main(Strin…
摘录 1. 计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入.由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度.因此在CPU里面就有了高速缓存.也就是,当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行…
线程作为java面试中必须要掌握的一环,volatile多少也会在面试中被问到,所以就需要好好研究下,以面对面试官的问题. 首先要清楚线程不安全是什么原因引起的,需要明白计算机的cpu执行每条指令时都需要从高速缓存(cache)获取数据,如果没有则从主存中获取.这个就是问题的关键所在,当在多线程环境下每个线程都会有自己的线程栈,它们所持有的资源不是线程共享的,如果多线程都执行了对同一个变量的修改,那么在线程把值写回主存前,另一线程也修改了旧值,就会出现结果不一致的问题. 知道java内存模型就能…
大概是因为项目.业务的原因,工作上几乎还没有使用过多线程相关的功能,相关知识差不多都忘了,所以最近补一下基础. volatile用来修饰共享变量,volatile变量具有 synchronized 的可见性特性,但是不具备原子特性.volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值.当成员变量发生变化时,强迫线程将变化值回写到共享内存.以保证在同一时刻,不同的线程看到该成员变量的值是一致的. 因为volatile关键字与Java的内存模型有关,所以先看一下Ja…