volatile

Java源码阅读之:AtomicInteger

喜欢而已 提交于 2019-12-26 07:43:47
AtomicInteger源码分析 Top:带着问题看源码 在这周之前对原子类毫无了解,前面看了Unsafe类,对CAS操作有了一点了解。所以看AtomicInteger时的问题很简单,弄清楚它是什么类,有什么作用。 参考: 彤哥读源码 https://mp.weixin.qq.com/s/DdwSC5bYgFCWwnb0jxkspg 一:简介 AtomicInteger是java并发包下面提供的原子类,主要操作的是int类型的整型,通过调用底层Unsafe的CAS等方法实现原子操作。 原子操作 原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换。 原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割而只执行其中的一部分,将整个操作视作一个整体是原子性的核心特征。 我们这里说的原子操作与数据库ACID中的原子性,彤哥认为,数据库中的原子性主要运用在事务中,一个事务之内的所有更新操作要么都成功,要么都失败,事务是有回滚机制的,而这里说的原子操作是没有回滚的,这是最大的区别。 二:源码解析 总的来说,源码还是很简单的,很容易理解。提供原子操作主要是利用Unsafe类中的CAS方法。 属性 // 获取Unsafe实例 private static final Unsafe unsafe =

【面试专栏】深入理解volatile

坚强是说给别人听的谎言 提交于 2019-12-26 05:54:47
文章同步更新在个人公众号“梓莘”,欢迎大家关注,相互交流。 谈谈对volatile的理解 volatile是java虚拟机提供的轻量级的同步机制(同步比如synchronized)拥有3大特性: 保证可见性 不保证原子性 禁止指令重排 简单来说也就是volatile保证可见和有序,但是并不保证原子性。 要更好的理解这个需要对JMM有个大概的了解,接下来先看下JMM的简单概念。 谈谈JMM(Java Memory Model) JMM也就是java内存模型,它本身是一种抽象的概念,描述的是一种规则或规范,通过程序中各个变量(实例字段、静态字段和构成数组对象中的元素)的访问方式。 JMM关于同步的规定: 线程解锁前,必须把共享变量的值刷新回主内存 线程加锁前,必须读取主内存中的最新值到自己的工作内存 加锁解锁是同一把锁 由于JMM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),工作内存是每个线程的私有数据区域,而java内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要 将变量从主内存拷贝到自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,各个线程中的工作内存中存储着主内存中的变量副本拷贝

JDK源码学习笔记1-AbstractMap

家住魔仙堡 提交于 2019-12-25 19:59:35
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> AbstractMap这个 类 主要是为了减轻实现Map接口的任务而设计的,这样一些简单通用的方法就不用各种Map自己一一实现了。 在看这个类的时候,我发现了2个地方是我需要学习的: 1、根据需要,一个方法可以写成只抛出一个异常 public V put(K key, V value) { throw new UnsupportedOperationException(); } AbstractMap 实现 了Map接口,因此必须要有put()方法,而像我的话可能方法中直接就什么都不写了。但显然源码中技高一筹,就只抛出个异常, 这样继承AbstractMap的子类如果没有自己实现put()方法就会抛出这个异常,告诉编码者需要自己去实现这个方法,而不是什么反应都没有了。虽然是很小的细节,但对以后可能出现的问题做了预防,很值得学习。 2、transient和volatile关键词的使用 transient volatile Set<K> keySet = null; transient volatile Collection<V> values = null; 下面给出网络上找到的对这两个关键词的解释: transient是 变量 修饰符 ,表明该字段不是对象持久状态的一部分,储存的时候不用储存,比如 序列化

认识volatile

北战南征 提交于 2019-12-25 19:39:02
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> volatile关键字不用多说,就是保证内存可见性,被它修饰的变量在被线程改变之后会马上同步回主内存(这句话实际有点问题,并不是会立马同步,而是在缓存行没空间或者遵循最晚时间原则),但是肯定能确保其他线程读到的是最新的值,这里直接上demo了(不BB那些没用的): package unsafe; /** * @Authror ayo * @Date 2019/12/25 14:39 */ public class VolatileDemo { /** * 闹钟是否响铃(true代表响铃,false代表没响铃) */ private static boolean isClockRang = false; public static void main(String[] args) throws InterruptedException { new Thread(new Runnable() { @Override public void run() { //如果闹铃不响我就一直睡觉 while (!isClockRang){ } System.out.println("起床了"); } }, "Thread1").start(); //休眠一秒钟,让线程1先跑起来 Thread.sleep(1000); new

Java Integer(-128~127)值的==和equals比较产生的思考

纵饮孤独 提交于 2019-12-25 15:44:03
相关资料 ------------------------------------------------------------------------------------- Java多线程demo https://github.com/Beerkay/JavaMultiThreading Java多线程简介 http://www.runoob.com/java/java-multithreading.html Java多线程PPT参考 https://wenku.baidu.com/view/c365afe4d5bbfd0a795673cf.html https://wenku.baidu.com/view/5e24de023868011ca300a6c30c2259010202f317.html 其它多线程资料 https://blog.csdn.net/gf771115/article/details/51682561 http://ishare.iask.sina.com.cn/f/1H17Nwdhal1E.html https://max.book118.com/html/2016/1205/68594207.shtm the first share ----------------------------------------------------------

各大公司Java后端开发面试题

吃可爱长大的小学妹 提交于 2019-12-25 13:14:40
各大公司Java后端开发面试题 原创 2017年03月01日 11:31:11 标签: java / 面试题 / Spring / 春招 / BAT 40184 ThreadLocal(线程变量副本) Synchronized实现内存共享,ThreadLocal为每个线程维护一个本地变量。 采用空间换时间,它用于线程间的数据隔离,为每一个使用该变量的线程提供一个副本,每个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。 ThreadLocal类中维护一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值为对应线程的变量副本。 ThreadLocal在Spring中发挥着巨大的作用,在管理Request作用域中的Bean、事务管理、任务调度、AOP等模块都出现了它的身影。 Spring中绝大部分Bean都可以声明成Singleton作用域,采用ThreadLocal进行封装,因此有状态的Bean就能够以singleton的方式在多线程中正常工作了。 友情链接: 深入研究java.lang.ThreadLocal类 Java内存模型: Java虚拟机规范中将Java运行时数据分为六种。 1.程序计数器:是一个数据结构,用于保存当前正常执行的程序的内存地址。Java虚拟机的多线程就是通过线程轮流切换并分配处理器时间来实现的,为了线程切换后能恢复到正确的位置

Volatile classes in C++

半城伤御伤魂 提交于 2019-12-25 04:57:30
问题 I have a question concerning volatile keyword I can't seem to find an answer for. In my app I have data class that is shared as a state buffer between threads, and I need it to be updated regularly from multiple threads. Class looks like this: class CBuffer { //Constructor, destructor, Critical section initialization/destruction //... volatile wstring m_strParam; //... void InterlockedParamSetter(const wstring &strIn); wstring InterlockedParamGetter(); ParamSetter(const wstring &strIn);

Property with Volatile or Lock

好久不见. 提交于 2019-12-25 02:08:52
问题 I have a property with a backing field which I want to make thread safe (get and set). The get and set method has no logic except the setting and returning. I think there are two ways to capsule the logic in the property self (volatile and lock). Is my understanding of the two's correct or have I make any mistakes? Below are my examples: public class ThreadSafeClass { // 1. Volatile Example: private volatile int _processState_1; public int ProcessState_1 { get { return _processState_1; } set

AtomicReference 和 volatile 的区别

核能气质少年 提交于 2019-12-25 01:59:33
首先volatile是java中关键字用于修饰变量,AtomicReference是并发包java.util.concurrent.atomic下的类。 首先volatile作用,当一个变量被定义为volatile之后,看做“程度较轻的 synchronized”,具备两个特性: 1.保证此变量对所有线程的可见性(当一条线程修改这个变量值时,新值其他线程立即得知) 2.禁止指令重新排序 注意volatile修饰变量不能保证在并发条件下是线程安全的,因为java里面的 运算 并非原子操作。 java.util.concurrent.atomic工具包,支持在单个变量上解除锁的线程安全编程。其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个另一个线程进入,这只是一种逻辑上的理解。 volatile是不能保证原子性的, 写了一点junit. 这里使用了包装类Integer, 来验证 对引用操作 的原子性. 可以看到使用了AtomicReference可以保证结果是正确的. 1 private static volatile Integer num1 = 0; 2 private static

Java多线程整理(li)

那年仲夏 提交于 2019-12-25 01:57:38
目录: 1.volatile变量 2.Java并发编程学习 3. CountDownLatch用法 4. CyclicBarrier使用 5.BlockingQueue使用 6.任务执行器Executor 7.CompletionService使用 8.ConcurrentHashMap使用 9.Lock使用 一、 volatile变量   1.volatile原理:volatile的原理实际上是告诉处理器,不要把变量缓存在寄存器或者相对于其他处理器不可见的地方,而是把变量放在主存,每次读写操作都在主存上进行操作。另外,被申明为volatile的变量也不会与其它内存中的变量进行重排序。   2.volatile同步:volatile是同步的一个子集,只保证了变量的可见性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。相对于同步而言,volatile的优势:a.简易性,可以像使用其他变量一样使用volatile变量;b.volatile变量不会造成线程阻塞; c. 如果读操作远远大于写操作,volatile 变量还可以提供优于锁的性能优势 。   3.正确使用volatile条件:对变量的写操作不依赖于当前值;该变量没有包含在具有其他变量的不变式中; /* * 对于第一条原则:对变量的写操作不依赖于当前值; * 虽然i++只有一条语句