volatile

volatile关键字及使用场景

﹥>﹥吖頭↗ 提交于 2019-12-05 14:36:02
一、原子性、可见性和有序性 Java内存模型主要是围绕着线程并发过程中如何处理原子性、可见性和顺序性这三个特征来设计的。 1、原子性 原子性表示任意时刻只有一个线程可以执行某一段功能代码,以防止多个线程同时访问某些共享数据时,造成错误。 2、可见性 可见性是指一个线程修改了某个共享变量后,其他线程能够立刻访问到被修改后的最新数据,也就是共享数据对其他线程都是可见的。 volatile修饰的变量在修改后会立即同步到主内存,在使用时会重新从主内存中读取。volatile变量是依赖主内存为中介来保证多线程下变量对其他线程的可见性。 synchronized关键字是通过在unlock之前必须把变量同步回主内存来实现可见性的。 final关键字则是因为变量在初始化后,值就不会更改,所以只要在初始化过程中没有把this指针传递出去也能保证对其他线程的可见性。 3、有序性 程序在运行时,指令的执行顺序并不是严格按照从上到下顺序执行的,可能会进行指令重排。根据CPU流水线作业,一般来说,简单的操作会先执行,复杂的操作后执行。 有序性从不同的角度来看是不同的。单纯从单线程来看都是有序的,但到了多线程就不一样了。可以这么理解,如果在一个线程内部观察,所有操作都是有序的。但是如果在一个线程内观察另一个线程,操作可能是无序的。也就是CPU进行的指令重排序对单线程程序而言,不会有什么问题,但是对于多线程程序

synchronized与Lock、volatile的区别

核能气质少年 提交于 2019-12-05 14:34:16
synchronized与volatile的区别 volatile是线程同步的轻量级实现,因此volatile性能好于synchronized voaltile修饰变量,synchronized修饰方法和代码块 多线程访问volatile不会发生阻塞,但访问synchronized可能会阻塞 volatile可以保证数据的可见性,但不能保证原子性;而synchronized既可以保证原子性,也可以间接保证可见性。 volatile解决的是变量在多个线程之间的可见性,而Synchronized解决的是多个线程之间访问资源的同步性 synchronized与ReentrantLock的区别 都是可重入锁 synchronized是依赖于JVM实现的;而reentrantLock是依赖于JDK实现的,是API层面的,需要Lock()和unLock()方法配合try/finally语句块来完成。 reentrantLock比synchronized多了三项功能:等待可中断,可实现公平锁,可实现选择性通知(锁可绑定多个条件)。 等待可中断: 等待可中断是指线程可以选择放弃等待,改为处理其他事情,ReenTrantLock通过lock.lockInterruptibly()来实现的。 公平锁: 先等待的线程先获得锁。Synchronized只能是非公平锁

Why this program does not go into infinite loop in absence of volatility of a boolean condition variable?

岁酱吖の 提交于 2019-12-05 14:26:25
I wanted to understand on when exactly I need to declare a variable as volatile. For that I wrote a small program and was expecting it to go into infinite loop because of missing volatility of a condition variable. It did not went into infinite loop and worked fine without volatile keyword. Two questions: What should I change in the below code listing - so that it absolutely requires use of volatile? Is C# compiler smart enough to treat a variable as volatile - if it sees that a variable is being accessed from a different thread? The above triggered more questions to me :) a. Is volatile just

Force order of execution of C statements?

青春壹個敷衍的年華 提交于 2019-12-05 14:17:31
问题 I have a problem with the MS C compiler reordering certain statements, critical in a multithreading context, at high levels of optimization. I want to know how to force ordering in specific places while still using high levels of optimization. (At low levels of optimization, this compiler does not reorder statements) The following code: ChunkT* plog2sizeChunk=... SET_BUSY(plog2sizeChunk->pPoolAndBusyFlag); // set "busy" bit on this chunk of storage x = plog2sizeChunk->pNext; produces this:

【搞定 Java 并发面试】面试最常问的 Java 并发进阶常见面试题总结!

大兔子大兔子 提交于 2019-12-05 13:46:24
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star!【Java学习+面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。觉得内容不错再 Star!)。 另外推荐一篇原创: 终极推荐!可能是最适合你的Java学习路线+方法+网站+书籍推荐! Java 并发进阶常见面试题总结 1. synchronized 关键字 1.1. 说一说自己对于 synchronized 关键字的了解 synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。 另外,在 Java 早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(monitor)是依赖于底层的操作系统的 Mutex Lock 来实现的,Java 的线程是映射到操作系统的原生线程之上的。如果要挂起或者唤醒一个线程,都需要操作系统帮忙完成,而操作系统实现线程之间的切换时需要从用户态转换到内核态,这个状态之间的转换需要相对比较长的时间,时间成本相对较高,这也是为什么早期的 synchronized 效率低的原因。庆幸的是在 Java 6 之后 Java 官方对从 JVM 层面对synchronized 较大优化,所以现在的 synchronized

Proper use of volatile variables and synchronized blocks

断了今生、忘了曾经 提交于 2019-12-05 12:41:45
I am trying to wrap my head around thread safety in java (or in general). I have this class (which I hope complies with the definition of a POJO) which also needs to be compatible with JPA providers: public class SomeClass { private Object timestampLock = new Object(); // are "volatile"s necessary? private volatile java.sql.Timestamp timestamp; private volatile String timestampTimeZoneName; private volatile BigDecimal someValue; public ZonedDateTime getTimestamp() { // is synchronisation necessary here? is this the correct usage? synchronized (timestampLock) { return ZonedDateTime.ofInstant

并行计算:并行I/O服务器的操作参数

╄→гoц情女王★ 提交于 2019-12-05 12:01:38
视频来源:新竹清华大学:并行计算与并行编程课程 上图结论:随着年限,计算力的增长很快,而I/O近于平缓,二者之间的差距增大,带来不利的影响。需要一些方法来处理这较大的差距。 解决方案: 1:I/O 内存等级:寻找新的硬件存储 2: 并行I/O:资源是分散式的,每一层最好是平行,可以发挥出最好性能。OST:存放目录索引数据,这里是Non-volatile内存。 3:Burst buffering: Buffering(传输资料时速度不同一,通过在中间增加一块内存进行缓和),优点:由于是内存,速度快,前面部分burst,后半部分频宽很稳定。而且是non-volatile内存可以防止资料丢失。 总结: 来源: https://www.cnblogs.com/fourmi/p/11923598.html

Java: Is volatile / final required for reference to synchronized object?

不羁的心 提交于 2019-12-05 12:00:06
问题 This seems a pretty basic issue, but I cannot find a clear confirmation. Let's say I have a class properly synchronized in itself: public class SyncClass { private int field; public synchronized void doSomething() { field = field * 2; } public synchronized void doSomethingElse() { field = field * 3; } } If I need to have a reference to an instance of that class, shared between threads, I do still need to declare that instance volatile or final , am I right? As in: public class MainClass { //

volatile 作用

别等时光非礼了梦想. 提交于 2019-12-05 11:44:24
volatile使用场景:线程间共享变量需要使用 volatile 关键字标记,确保线程能够读取到更新后的最新变量值。 volatile关键字的目的是告诉虚拟机: 1.每次访问变量时,总是获取主内存的最新值。 2.每次修改变量后,立刻会写到主内存。 所以volatile解决的是可见性的问题: 1.当一个线程修改了某个共享变量的值,其他线程能够立刻看到修改之后的值。 来源: https://www.cnblogs.com/ming-blogs/p/11923108.html

JUC-1-volatile

╄→尐↘猪︶ㄣ 提交于 2019-12-05 11:04:56
什么是volatile关键字 volatile是轻量级同步机制,与synchronized相比,他的开销更小一些,同时安全性也有所降低,在一些特定的场景下使用它可以在完成并发目标的基础上有一些性能上的优势. volatile修饰的变量对所有线程的可见性 为什么用volatile 解决 多个线程操作共享数据(这个数据在内存中) 彼此得到内存中共享数据不可见 也就是说多个线程操作要操作同一个变量 , 某个线程改变了变量的值 , 其他线程也能看到改变后的变量的值 如何用volatile 两个线程 ThreadDemo的线程 main线程 里面关注while循环 ThreadDemo类中定义一个变量flag ThreadDemo的线程已经结束 打印出flag=true main线程没有停止 原因 while语句中得到的是flag=false 一直在循环 出现了 内存不可见的场景 使用volatile关键字修饰 flag 变量 两个线程都结束 都能拿到内存中 flag=true数据 1 package com.wf.zhang.juc; 2 3 public class TestVolatile { 4 5 public static void main(String[] args) { 6 ThreadDemo t =new ThreadDemo(); 7 new Thread(t)