多线程--volatile】的更多相关文章

volatile是C#中最简单的一种同步关键字,其意义是针对程序中一些敏感数据,不允许多线程同时访问,保证数据在任何访问时刻,最多有一个线程访问,以保证数据的完整性,虽与java中的synchronized 关键字有些类似相似,但是二者存在着很大的不同,最明显的地方就是volatile是修饰变量的修饰符,而synchronized是修饰一段代码或方法. volatile使变量保证了在内存中的共享,也就是其修饰的字段没有放在工作内存(寄存器),而是被直接放在主存操作,当一个线程修改了其修饰的变量,…
volatile是轻量级的synchronized,在多处理器(多线程)开发中保证了共享变量的"可见性".可见性表示当一个线程修改了一个共享变量时,另外一个线程能读到这个修改的值.正确的使用volatile,能比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度.使用时只需要把字段声明成volatile即可.   处理器实现,有volatile变量修饰的共享变量进行写操作的时候会出现LOCK前缀指令.触发两件事情,1.将当前处理器缓存行的数据写回到系统内…
1.并发编程中的三个概念 原子性:一个或多个操作.要么全部执行完成并且执行过程不会被打断,要么不执行.最常见的例子:i++/i--操作.不是原子性操作,如果不做好同步性就容易造成线程安全问题. 可见性:多个线程访问同一个变量,一个线程改变了这个变量的值,其他线程可以立即看到修改的值.可见性的问题,有两种方式保证.一是volatile关键字,二是通过synchronized和lock.详细在后面. 有序性:程序执行的顺序按照代码的先后顺序执行. 要了解有序性需要了解一下指令重排序.处理器为了提供运…
谈谈Java中的volatile   内存可见性 留意复合类操作 解决num++操作的原子性问题 禁止指令重排序 总结 内存可见性 volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色.同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级,相比使用synchronized所带来的庞大开销,倘若能恰当的合理的使用volatile,自然是美事一桩. 为了能比较清晰彻底的理解volatile,我们一步一步来分析.首…
内存可见性(Memory Visibility) 1 内存可见性(Memory Visibility)是指当某个线程正在使用对象状态而另一个线程在同时修改该状态,需要确保当一个线程修改了对象状态后,其他线程能够看到发生的状态变化. 2 可见性错误是指当读操作与写操作在不同的线程中执行时,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情.我们可以通过同步来保证对象被安全地发布.除此之外我们也可以使用一种更加轻量级的 volatile 变量. volatile 关…
多线程一直以来都是面试必考点,而volatile.synchronized也是必问点,这里我试图用容易理解的方式来解释一下volatile. 来看一下它的最大特点和作用: 一 使变量在多个线程间可见 猛一看很奇怪,我定义个变量就好了,大家都能访问啊,为毛在多个线程间会有变量不可见? 换种说法,我在一个线程里去修改另外一个线程的变量,可能会修改不成功!而且是永远不成功. 这下更懵逼了,为毛? 来看一下java的内存模型简易图 这个图我来解释一下,先看堆内存区域(被所有线程共享)这个地方. 首先我们…
一.volatile 介绍 volatile 关键字指示一个字段可以由多个同时执行的线程修改. 声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制. 这样可以确保该字段在任何时间呈现的都是最新的值. volatile 修饰符通常用于由多个线程访问但不使用 lock 语句对访问进行序列化的字段. volatile 关键字可应用于以下类型的字段: 引用类型. 指针类型(在不安全的上下文中). 请注意,虽然指针本身可以是可变的,但是它指向的对象不能是可变的. 换句话说,您无法声…
volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性,即多线程环境中,使用 volatile 关键字的变量仅可以保证不同线程读取变量时,可以读到最新修改的变量值,但是修改变量值时,却不能保证线程安全(可能存在写值覆盖现象).以下测试代码,展示了使用volatile关键字的几种方式. /** * <b>volatile 关键字正确用法</b><br> * @author Gaylen * @version V1.1.0 * history…
在解释volatile关键字之前,先说说java的指令重排以及代码的执行顺序. 指令重排: public void sum(){ int x = 1; int y = 2; int x = x + 1; int sum = x + y; } 按代码的顺序,执行时先给x赋值再给y赋值,再执行x=x+1;最后求和. 由于x=x+1和sum=x+y是写操作不会进行指令重排,但是x=1与y=2是不互斥的:出于性能优化的考虑(对x赋值后直接对x进行操作可以节省重新获取x内存地址的时间),指令重排的最大可能…
作者: dreamcatcher-cx 出处: <http://www.cnblogs.com/chengxiao/> 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在页面明显位置给出原文链接. ------------------------------ 总结 简单总结下,volatile是一种轻量级的同步机制,它主要有两个特性: 一.是保证共享变量对所有线程的可见性: 二.是禁止指令重排序优化.(指令重排序,对单线程安全,对多线程不安全) 同时需要注意的是,vol…