volatile

volatile vs memory barrier for interrupts

守給你的承諾、 提交于 2019-12-02 01:00:32
问题 Let x and y be variables that are shared between main code and interrupt code. My idea of volatile is that it is only and always needed for hardware variables and interrupt variables that are also used in main code. Every usage of x and y in the main code is guaranteed to be atomic by disabling interrupts. Do x and y really need to be volatile , or is it enough to put a memory barrier before using them to force reloading the variables from RAM? A) volatile bool x; volatile int y[100]; int

Some doubts about volatile and Atomic classes?

隐身守侯 提交于 2019-12-01 23:49:03
问题 i am going thru Java threads book. I came across this statement Statement 1:- "volatile variables can be safely used only for single load or store operation and can't be applied to long or double variales. These restrictions make the use of volatile variables uncommon" I did not get what does single load or store operation mean here? why volatile can't be applied to long or double variales? Statement 2:- "A Volatile integer can not be used with the ++ operator because ++ operator contains

JVM和线程池

别来无恙 提交于 2019-12-01 22:00:31
本文链接:https://blog.csdn.net/liuwenliang_002/article/details/90074283 ———————————————— 版权声明:本文为CSDN博主「30以后的男人」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/liuwenliang_002/article/details/90074283 jvm结构原理,GC工作原理 Jvm结构: Jvm主要包括四个部分: 1、类加载器(ClassLoad) 在JVM启动时或者在类运行时将需要的class加载到JVM中。 类加载时间与过程: 类从被加载到虚拟机内存开始,在到卸载出内存为止,正式生命周期包括了:加载,验证,准备,解析,初始化,使用和卸载7个阶段。其中验证、准备、解析这个三个步骤被统称为连接(linking)。 其中,加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的 ,类的加载过程必须按照这种顺序按部就班的“开始”(仅仅指的是开始,而非执行或者结束,因为这些阶段通常都是互相交叉的混合进行,通常会在一个阶段执行的过程中调用或者激活另一个阶段),而解析阶段则不一定(它在某些情况下可以在初始化阶段之后再开始,这是为了支持java语言的运行时绑定) 在以下几种情况下

Some doubts about volatile and Atomic classes?

安稳与你 提交于 2019-12-01 21:40:50
i am going thru Java threads book. I came across this statement Statement 1:- "volatile variables can be safely used only for single load or store operation and can't be applied to long or double variales. These restrictions make the use of volatile variables uncommon" I did not get what does single load or store operation mean here? why volatile can't be applied to long or double variales? Statement 2:- "A Volatile integer can not be used with the ++ operator because ++ operator contains multiple instructions.The AtomicInteger class has a method that allows the integer it holds to be

mutable和volatile

依然范特西╮ 提交于 2019-12-01 21:08:19
类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。 mutable在类中只能够修饰 非静态数据成员 。 mutable则是为了能突破const的封锁线,让类的一些次要的或者是辅助性的成员变量随时可以被更改。 const和mutable关键字只是给了建模工具更多的 设计约束 和 设计灵活性。 volatile修饰的数据,编译器不可对其进行执行期寄存于寄存器的优化。这种特性,是为了满足多线程同步、中断、硬件编程等特殊需要。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的直接访问。 http://blog.csdn.net/tht2009/article/details/6920511 来源: oschina 链接: https://my.oschina.net/u/2453047/blog/653884

非阻塞算法

和自甴很熟 提交于 2019-12-01 20:37:44
原文地址 作者: Jakob Jenkov 译者:张坤 在并发上下文中,非阻塞算法是一种允许线程在阻塞其他线程的情况下访问共享状态的算法。在绝大多数项目中,在算法中如果一个线程的挂起没有导致其它的线程挂起,我们就说这个算法是非阻塞的。 为了更好的理解阻塞算法和非阻塞算法之间的区别,我会先讲解阻塞算法然后再讲解非阻塞算法。 阻塞并发算法 一个阻塞并发算法一般分下面两步: 执行线程请求的操作 阻塞线程直到可以安全地执行操作 很多算法和并发数据结构都是阻塞的。例如, java.util.concurrent.BlockingQueue 的不同实现都是阻塞数据结构。如果一个线程要往一个阻塞队列中插入一个元素,队列中没有足够的空间,执行插入操作的线程就会阻塞直到队列中有了可以存放插入元素的空间。 下图演示了一个阻塞算法保证一个共享数据结构的行为: 非阻塞并发算法 一个非阻塞并发算法一般包含下面两步: 执行线程请求的操作 通知请求线程操作不能被执行 Java也包含几个非阻塞数据结构。 AtomicBoolean , AtomicInteger , AtomicLong , AtomicReference 都是非阻塞数据结构的例子。 下图演示了一个非阻塞算法保证一个共享数据结构的行为: 非阻塞算法 vs 阻塞算法 阻塞算法和非阻塞算法的主要不同在于上面两部分描述的它们的行为的第二步。换句话说

Java关键字transient和volatile

荒凉一梦 提交于 2019-12-01 19:41:19
转载自:https://blog.csdn.net/itismelzp/article/details/50539550 1. transient 词义:短暂的 首先说说“序列化”,把一个对象的表示转化为字节流的过程称为串行化(也称为序列化,serialization),从字节流中把对象重建出来称为反串行化(也称为为反序列化,deserialization)。transient 为不应被串行化的数据提供了一个语言级的标记数据方法。 transient是类型修饰符,只能用来修饰字段。在对象序列化的过程中,标记为transient的变量不会被序列化。 class Test { transient int a; // 不会被持久化 int b; // 持久化 } 当类Test的实例对象被序列化(比如将Test类的实例对象 t 写入硬盘的文本文件t.txt中),变量 a 的内容不会被保存,变量 b 的内容则会被保存。 2. volatile 词义:易变的 volatile也是变量修饰符,只能用来修饰变量。volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。 在此解释一下Java的内存机制: Java使用一个主内存来保存变量当前值

Java并发编程之多线程同步

十年热恋 提交于 2019-12-01 18:48:24
线程安全就是防止某个对象或者值在多个线程中被修改而导致的数据不一致问题,因此我们就需要通过同步机制保证在同一时刻只有一个线程能够访问到该对象或数据,修改数据完毕之后,再将最新数据同步到主存中,使得其他线程都能够得到这个最新数据。下面我们就来了解Java一些基本的同步机制。 Java提供了一种稍弱的同步机制即volatile变量,用来确保将变量的更新操作通知到其他线程。当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的。然而,在访问volatile变量时不会执行加锁操作,因此也就不会使线程阻塞,因此volatile变量是一种比synchronized关键字更轻量级的同步机制。 volatile变量对所有的线程都是可见的,对volatile变量所有的写操作都能立即反应到其他线程之中,即volatile变量在各个线程中是一致的。 有一种情况需要注意:volatile的语义不能确保递增(count++)的原子性,除非你能确保只有一个线程对变量执行写操作。 123456789101112131415161718192021222324252627282930313233 public class VolatileTest{ public static volatile int i; public static void increase(){ i++; }

设计模式之单例模式

心不动则不痛 提交于 2019-12-01 18:45:20
参考资料: 老司机来教你单例的正确姿势 《Android源码设计模式解析与实战》 单例模式可以说是应用最广泛的模式了, 面试也经常被问到, 经常会被要求能够手写单例, 所以我今天也来总结一下 单例模式的定义 确保某一个类只有一个实例, 并且自定实例化并向整个系统提供这个实例 单例模式的使用场景 确保某个类有且只有一个对象的场景, 避免产生多个对象消耗过多的资源, 或者某种类型的对象只应该有且只有一个.例如, 创建一个对象需要消耗的资源过多, 如要访问IO和数据库等资源 单例的UML类图 插点题外话说一下怎么看UML类图, 例如这里的Singleton矩形框就代表一个类, 第一层显示类的名称, 抽象类用斜体表示; 第二层是类的特性, 通常是字段和属性; 第三层是类的操作, 通常是方法. ‘+’表示public, ‘-‘表示private, ‘#’表示protected, 例如这里的getInstance()方法是public的, 构造方法是private的. 与类图有区别的是接口图, 顶端有 <<interface>> 显示 实现单例模式有一下几个关键点: 构造函数不对外开放, 一般为private, 是的客户端不能通过new的形式手动构造单例类的对象 通过一个静态方法或者枚举返回单例类对象 在多线程环境中也需要确保单例类的对象有且只有一个 确保单例类对象在反序列化时不会重新构建对象

volatile与JMM

亡梦爱人 提交于 2019-12-01 18:22:50
Volatile 是 Java 虚拟机提供的轻量级的同步机制 保证可见性 禁止指令排序 不保证原子性 JMM(Java Memory Model)内存模型 本身是一种抽象的概念并不是真实存在,它描述的是一组规定或则规范,通过这组规范定义了程序中的访问方式。 JMM 同步规定 线程解锁前,必须把共享变量的值刷新回主内存 线程加锁前,必须读取主内存的最新值到自己的工作内存 加锁解锁是同一把锁 由于 JVM 运行程序的实体是线程,而每个线程创建时 JVM 都会为其创建一个工作内存,工作内存是每个线程的私有数据区域,而 Java 内存模型中规定所有变量的储存在主内存,主内存是共享内存区域,所有的线程都可以访问,但线程对变量的操作(读取赋值等)必须都在工作内存进行。 首先要将变量从主内存拷贝的自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,工作内存中存储着主内存中的变量副本拷贝,前面说过,工作内存是每个线程的私有数据区域,因此不同的线程间无法访问对方的工作内存,线程间的通信(传值)必须通过主内存来完成。 JMM三大特性 : 可见性(vol atile ) 一旦有一个变量被修改,立刻通知所有其他线程更新这个变量的副本 原子性 保持数据的完整一致性 。某个线程正在工作时,中间不可被分割,需要整体完整。要么同时成功,要么同时失败。(volatile