Java多线程——volatile关键字、发布和逸出

1、volatile关键字  

Java语言提供了一种稍弱的同步机制,即volatile变量。被volatile关键字修饰的变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在每次读取volatitle类型变量时总会返回最新的值,而不是从寄存器中获取。

  加锁机制既然可以确保可见性又可以确保原子性,而volatile只能确保可见性。

2、发布和逸出

  发布(Publish)”一个对象指,使对象能够在当前作用域之外的代码中使用。如将指向该对象的引用保存到其他代码可以访问的地方,或者在某一个非私有的方法中返回该引用,或者将引用传递到其他类的方法中。

  当某个不该发布的对象被发布时,这种情况称为逸出(Escape).

时间: 2024-10-13 08:04:38

Java多线程——volatile关键字、发布和逸出的相关文章

java多线程 -- volatile 关键字 内存 可见性

内存可见性(Memory Visibility) 1 内存可见性(Memory Visibility)是指当某个线程正在使用对象状态而另一个线程在同时修改该状态,需要确保当一个线程修改了对象   状态后,其他线程能够看到发生的状态变化. 2 可见性错误是指当读操作与写操作在不同的线程中执行时,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情.   我们可以通过同步来保证对象被安全地发布.除此之外我们也可以使用一种更加轻量级的 volatile 变量. vola

[Java多线程] volatile 关键字正确使用方法

volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性,即多线程环境中,使用 volatile 关键字的变量仅可以保证不同线程读取变量时,可以读到最新修改的变量值,但是修改变量值时,却不能保证线程安全(可能存在写值覆盖现象).以下测试代码,展示了使用volatile关键字的几种方式. 1 /** 2 * <b>volatile 关键字正确用法</b><br> 3 * @author Gaylen 4 * @version V1.1.0 5

Java多线程volatile关键字

JVM中,分为JVM Client模式,JVM Server模式.两者区别并不大,但serve启动模式启动较慢,但一旦运行起来后,在hash和method call方面的效率,比Client模式效率高数十倍. 线程在读取数据时,首先从主内存中读取数据,保存在本地工作内存中,然后对数据进行修改,修改完毕后,写入本地工作内存中,再从工作内存写入主内存.示例图如下: JVM如果以Server模式启动时,为了线程的效率,线程在第一次读取数据后,将数据保存在工作内存中,之后读取数据时,均从工作内存中读取.

java中volatile关键字

java中volatile关键字 学习ImageLoader源码时遇到遇到这么一个关键字,以前没遇到过,也不明白是何含义,网上找了部分资料,总结记录一下. 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉.Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制. synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来

转:java中volatile关键字的含义

转:java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制. synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用 sync

【转】java中volatile关键字的含义

java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制. synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用 synchr

对象的发布与逸出

介绍发布与逸出的定义及代码示范,以及如何使用工厂方法避免this引用在构造方法中逸出 发布: “发布”一个对象是指,使对象能够在当前作用域之外的代码中使用. 例如:将一个指向该对象的引用保存到其他代码可以访问的地方,或者在某一个非私有的方法中返回该对象的引用,或者将引用传递到其他类的方法中. 代码示范:将一个指向该对象的引用,保存到其他代码可以访问的地方. // 保存在一个共有的静态变量中 public static Set<Secret> knowSecrets; public void i

Java线程安全性中的对象发布和逸出

发布(Publish)和逸出(Escape)这两个概念倒是第一次听说,不过它在实际当中却十分常见,这和Java并发编程的线程安全性就很大的关系. 什么是发布?简单来说就是提供一个对象的引用给作用域之外的代码.比如return一个对象,或者作为参数传递到其他类的方法中. 什么是逸出?如果一个类还没有构造结束就已经提供给了外部代码一个对象引用即发布了该对象,此时叫做对象逸出,对象的逸出会破坏线程的安全性. 概念我们知道了,可我们要关注什么地方呢?我们要关注的时候就是逸出问题,在不该发布该对象的地方就

就是要你懂Java中volatile关键字实现原理

原文地址http://www.cnblogs.com/xrq730/p/7048693.html,转载请注明出处,谢谢 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.concurrent包的核心,没有volatile就没有这么多的并发类给我们使用. 本文详细解读一下volatile关键字如何保证变量在多线程之间的可见性,在此之前,有必要讲解一下CPU缓存的相关知识,掌握这部分知识一定会让我们更好地理解volatile的原理,从而更好.更正确地地