volatile

synchronized和volatile的区别

夙愿已清 提交于 2020-01-24 15:24:37
Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存重新读取该成员的值,而且,当成员变量值发生变化时,强迫将变化的值重新写入共享内存,这样两个不同的线程在访问同一个共享变量的值时,始终看到的是同一个值。 java语言规范指出:为了获取最佳的运行速度,允许线程保留共享变量的副本,当这个线程进入或者离开同步代码块时,才与共享成员变量进行比对,如果有变化再更新共享成员变量。这样当多个线程同时访问一个共享变量时,可能会存在值不同步的现象。 而volatile这个值的作用就是告诉VM:对于这个成员变量不能保存它的副本,要直接与共享成员变量交互。 建议:当多个线程同时访问一个共享变量时,可以使用volatile,而当访问的变量已在synchronized代码块中时,不必使用。 缺点:使用volatile将使得VM优化失去作用,导致效率较低,所以要在必要的时候使用。 来源: https://www.cnblogs.com/zhengtu2015/p/4871460.html

java volatitle 多线程问题

柔情痞子 提交于 2020-01-24 08:56:12
我们知道,在Java中设置变量值的操作,除了long和double类型的变量外都是原子操作,也就是说,对于变量值的简单读写操作没有必要进行同步。 这在JVM 1.2之前,Java的内存模型实现总是从主存读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,现在在多线程环境下 volatile关键字的使用变得非常重要。在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行 读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。要解决这个问题,只需 要像在本程序中的这样,把该变量声明为volatile(不稳定的)即可,这就指示JVM,这个变量是不稳定的,每次使用它都到主存中进行读取。一般说 来,多任务环境下各任务间共享的标志都应该加volatile修饰。 Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。 Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。 这样当多个线程同时与某个对象交互时

C++ 原子操作和内存模型

故事扮演 提交于 2020-01-24 04:34:02
最近有一个困扰我的问题:如何使 C++ 的原子变量高效而且可移植? 我知道 Java volatile 是怎么工作的——它强制实行顺序一致性( sequential consistency ),但是这个方法并不总是效率最高的。 C++0x 原子变量在默认模式下也一样强制实施顺序一致性。如果没有特别的顺序注记( annotation ),它们和 Java volatile 几乎一模一样(有趣的是, Java 的 volatile 并不强制原子性——尽管有个 atomic library 来实现这一点)。 但是 C++ 可以在不同程度上放松顺序一致性的限制,如果使用得当的话,将会产生效率更高的代码。 在学习了一些 x86 的内存模型的知识后,我认识到一些基本的 lock-free pattern 无锁编程模式(比如我在 double-checked locking 重复检查锁模式中就发现了一种)可以直接运行而无需任何栅障同步( fence )。我们需要一种 C++ 编程思路,当编译成 x86 代码时,不产生栅障,而在编译成 alpha 或 Power PC 这样的非 x86 代码时,产生需要的栅障。 让事情更加有趣的是,一些其他的算法,如 Peterson 锁,在 x86 上还是需要内存栅障(请看我之前的 blog )。所以也不是简单的取消所有栅障就能搞定的。 我将我的问题缩短成

volatile和synchronized的区别

好久不见. 提交于 2020-01-23 20:10:40
volatile和synchronized的区别 volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。 volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的。 volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。 volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。 有可能有些读者还是会不大理解这里的区别,那我现在再来讲一讲线程安全的两个方面: 执行控制 和 内存可见 。 执行控制的目的是控制代码执行顺序及是否可以并发执行。 内存可见控制的是线程执行结果在内存中对其它线程的可见性。(根据Java内存模型的实现,线程在具体执行时,会先拷贝主存数据到线程本地(CPU缓存),操作完成后再把结果从线程本地刷到主存。) synchronized关键字解决的就是执行控制,它能控制代码执行的顺序,即如果一个线程正在进行被synchronized修饰的代码块时,它会阻止其他的线程进行这段代码块。更重要的是,synchronized还会创建一个内存屏障,内存屏障指令保证了所有CPU操作结果都会直接刷到主存中

What are “undetectable means” and how can they change objects of a C/C++ program?

China☆狼群 提交于 2020-01-23 17:28:45
问题 In ISO/IEC 14882:2003 (C++03) is stated under 7.1.5.1/8, section "The cv-qualifers": [Note: volatile is a hint to the implementation to avoid aggressive optimization involving the object because the value of the object might be changed by means undetectable by an implementation. See 1.9 for detailed semantics. In general, the semantics of volatile are intended to be the same in C++ as they are in C. ] These "means", that are undetectable by an implementation has been also already subject of

What are “undetectable means” and how can they change objects of a C/C++ program?

给你一囗甜甜゛ 提交于 2020-01-23 17:28:28
问题 In ISO/IEC 14882:2003 (C++03) is stated under 7.1.5.1/8, section "The cv-qualifers": [Note: volatile is a hint to the implementation to avoid aggressive optimization involving the object because the value of the object might be changed by means undetectable by an implementation. See 1.9 for detailed semantics. In general, the semantics of volatile are intended to be the same in C++ as they are in C. ] These "means", that are undetectable by an implementation has been also already subject of

volatile

∥☆過路亽.° 提交于 2020-01-23 13:12:36
Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉。 Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制。 synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用synchronized 修饰的方法 或者 代码块。 volatile 用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。volatile很容易被误用,用来进行原子性操作。 下面看一个例子,我们实现一个计数器,每次线程启动的时候,会调用计数器inc方法,对计数器进行加一 执行环境——jdk版本:jdk1.6.0_31 ,内存 :3G cpu:x86 2.4G 复制代码 代码如下: public class Counter { public static int count = 0; public static void inc() { //这里延迟1毫秒,使得结果明显 try { Thread

Why do all the member functions in std::atomic appear both with and without volatile?

倾然丶 夕夏残阳落幕 提交于 2020-01-23 05:27:31
问题 I noticed that most member functions of std::atomic<T> types are declared twice, once with the volatile modifier and once without (example)). I checked the source code of the G++ standard library implementation and I found all of them to be exact duplicates, for example, bool load(memory_order __m = memory_order_seq_cst) const noexcept { return _M_base.load(__m); } bool load(memory_order __m = memory_order_seq_cst) const volatile noexcept { return _M_base.load(__m); } I could not find any

JVM运行机制

孤街醉人 提交于 2020-01-22 20:57:10
jvm启动流程 JVM基本结构 JVM内存空间: 1、方法区:    保存装载的类信息 类型常量池   字段、方法信息 方法字节码   通常和永久区(perm) 关联在一起 JDK6时,String等常量信息置于方法 JDK7时,已经移动到了堆 2、PC寄存器 每个线程拥有一个PC寄存器 在线程创建时创建 指向下一条指令的地址 执行本地方法时,PC的值为undefined 3、JAVA堆   和程序开发密切相关 应用系统对象都保存在Java堆中 所有线程共享Java堆 对分代GC来说,堆也是分代的 GC的主要工作区间 4、Java栈 线程私有 栈由一系列帧组成(因此Java栈也叫做帧栈) 帧保存一个方法的局部变量、操作数栈、常量池指针 每一次方法调用创建一个帧,并压栈    JAVA 栈之局部变量表: 包含局部变量 和参数,如下代码在栈帧中的结构: public class StackDemo { public static int runStatic(int i,long l,float f,Object o ,byte b){ return 0; } public int runInstance(char c,short s,boolean b){ return 0; } }   runStatic            runInstance java栈之操作数栈:   

ARM裸机开发(二)中断编程

青春壹個敷衍的年華 提交于 2020-01-22 20:52:48
以下裸机程序基于GT2440,编译器为arm-linux-gcc-4.4.3。 程序布局:源代码由interrupt.S和led.c两个文件组成,interrupt负责初始化工作,led.c里定义了中断处理程序。 程序流程:首先安装异常向量表,在复位异常里关闭看门狗,然后进入普通中断模式,设置普通中断的栈指针(为C语言写的中断处理程序做准备),接着设为特权模式,初始化中断(设置IO管脚,开启中断),最后CPU一直死循环等待外部中断触发。当外部中断到来时,先保护现场,跳到led.c里的handle_irp()函数,在该函数里将四个LED点亮,接着返回,最后恢复现场,返回到死循环。 interrupt.S: 1 //寄存器物理地址宏定义 2 #define WTCON 0x53000000 3 4 #define GPFCON 0x56000050 5 #define nGPF_INT2 (0x02<<4) 6 #define nGPF_INT0 (0x02<<0) 7 #define EXINT0 0x56000088 8 9 #define SRCPND 0X4A000000 10 #define INTMOD 0X4A000004 11 #define INTMSK 0x4A000008 12 #define PRIORITY 0x4A00000C 13 #define