《Java程序猿面试笔试宝典》之volatile有什么作用

在由Java语言编写的程序中。有时候为了提高程序的执行效率,编译器会自己主动对其进行优化,把经常被訪问的变量缓存起来,程序在读取这个变量的时候有可能会直接从缓存(比如寄存器)中来读取这个值。而不会去内存中读取。这样做的一个优点是提高了程序的执行效率,但当遇到多线程编程时。变量的值可能由于别的线程而改变了,而该缓存的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致。比如,在本次线程内,当读取一个变量时,为提高存取速度,会先把变量读取到一个缓存中,当以后再取变量值时,就直接从缓存中取值。当变量值在本线程里改变时,会同一时候把变量的新值复制到该缓存中,以便保持一致。

volatile是一个类型修饰符(typespecifier)。它是被设计用来修饰被不同线程訪问和改动的变量。被volatile类型定义的变量,系统每次用到它的时候都是直接从相应的内存其中提取,而不会利用缓存。在使用了volatile修饰成员变量后,全部线程在不论什么时候看到的变量的值都是同样的。以下给出一个使用volatile的演示样例。


public class MyThread  implements  Runnable {

private volatile Boolean flag;

public void stop() {

flag = false;

}

public void run() {

while(flag)

;//do something

}

}

以上代码演示样例是用来停止线程最经常使用的一种方法。假设boolean类型的变量flag没有被声明为volatile,那么,当这个线程的run方法在推断flag值的时候,使用的有可能是缓存中的值,此时就不能及时地获取其他线程对flag所做的操作,因此会导致线程不能及时地停止。

须要注意的是,由于volatile不能保证操作的原子性,因此,普通情况下volatile不能取代sychronized。此外,使用volatile会阻止编译器对代码的优化,因此会减少程序的执行效率。所以,除非迫不得已。否则。能不使用volatile。则尽量不要使用volatile。

出自 新书《Java程序猿面试笔试宝典》官网

时间: 2024-12-14 18:44:44

《Java程序猿面试笔试宝典》之volatile有什么作用的相关文章

《Java程序猿面试笔试宝典》之字符串创建与存储的机制是什么

在Java语言中.字符串起着非常关键的数据.字符串的声明与初始化主要有例如以下两种情况:(1) 对于String s1=new String("abc")语句与String s2=new String("abc")语句,存在两个引用对象s1.s2,两个内容同样的字符串对象"abc".它们在内存中的地址是不同的.仅仅要用到new总会生成新的对象. (2) 对于String s1 = "abc"语句与String s2 = &qu

《Java程序猿面试笔试宝典》之Java与C/C++有什么异同

Java与C++都是面向对象语言,都使用了面向对象思想(比如封装.继承.多态等),因为面向对象有很多非常好的特性(继承.组合等),使得二者都有非常好的可重用性. 须要注意的是,二者并不是全然一样,以下主要介绍其不同点: (1)       Java为解释性语言,运行的过程为:源码经过Java编译器编译成字节码,然后由JVM解释运行.而C/C++为编译型语言,源码经过编译和链接后生成可运行的二进制代码.因此,Java的运行速度比C/C++慢,可是Java能够跨平台运行,而C/C++不能. (2) 

《Java程序猿面试笔试宝典》之Statickeyword有哪些作用

statickeyword主要有两种作用:第一,仅仅想为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关.第二,希望某个方法或属性与类而不是对象关联在一起,也就是说,在不创建对象的情况下就能够通过类来直接调用方法或使用类的属性.详细而言.static在Java语言中主要有四种使用情况:成员变量.成员方法.代码块.内部类. (1)static成员变量 尽管Java语言中没有全局的概念,但能够通过statickeyword来达到全局的效果.Java类提供了两种类型的变量:用static

《Java程序员面试笔试宝典》终于在万众期待中出版啦~

<Java程序员面试笔试宝典>终于在万众期待中出版啦~它是知名畅销书<程序员面试笔试宝典>的姊妹篇,而定价只要48元哦,恰逢求职季节,希望本书的出版能够让更多的求职者能够走进理想的企业 在这里,众多知名企业面试官将为你撕开神秘的求职面纱: 在这里,各种求职达人将现身说法为你揭开求职谜团: 在这里,各种类型的企业招聘细节都会被展露无疑: 在这里,我们将为你抽丝剥茧,还原IT行业的真相: 在这里,我们将为你指点迷津,告诉你职场上的风风雨雨: 在这里,我们将为你点石成金,成为那盏指引你前

《Java程序员面试笔试宝典》之字符串创建与存储的机制是什么

在Java语言中,字符串起着非常重要的作用,字符串的声明与初始化主要有如下两种情况:(1) 对于String s1=new String("abc")语句与String s2=new String("abc")语句,存在两个引用对象s1.s2,两个内容相同的字符串对象"abc",它们在内存中的地址是不同的.只要用到new总会生成新的对象. (2) 对于String s1 = "abc"语句与String s2 = "

《Java程序员面试笔试宝典》之为什么需要public static void main(String[] args)这个方法

public staticvoid main(String[] args)为Java程序的入口方法,JVM在运行程序的时候,会首先查找main方法.其中,public是权限修饰符,表明任何类或对象都可以访问这个方法,static表明main方法是一个静态方法,即方法中的代码是存储在静态存储区的,只要类被加载后,就可以使用该方法而不需要通过实例化对象来访问,可以直接通过类名.main()直接访问,JVM在启动的时候就是按照上述方法的签名(必须有public与static修饰,返回值为void,且方

JAVA程序员面试笔试宝典1

1.为什么Java中有些接口没有任何方法? 这些没有任何方法声明的接口又被称为标识接口,标识接口对于实现它的类没有任何语义上的要求,它仅仅充当一个标识的作用,用来表明它的类属于一个特定的类型. 2.java中的clone方法有什么作用? Object类提供了一个clone()方法,这个方法的作用是返回一个对象的复制.返回的是一个新的对象,而不是一个引用. 使用clone()方法的步骤: 实现clone的类首先需要继承Cloneable接口.Cloneable接口实质上是一个标识接口,没有任何接口

《PHP程序员面试笔试宝典》——如何回答系统设计题?

如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 应届生在面试时,偶尔也会遇到一些系统设计题,而这些题目往往只是测试求职者的知识面,或者测试求职者对系统架构方面的了解,一般不会涉及具体的编码工作.虽然如此,对于此类问题,很多人还是感觉难以应对,也不知道从何处答题. 如何应对此类题目呢?在正式介绍基础知识之前,首先列举几个常见的系统设计相关的面试.笔试题. 题目1:设计一个DNS的Cache结构,要求能够满足5000次/s以上的查询,满足IP数据的快速插入,查询的速度要快(题目

程序员面试笔试宝典学习记录(三)(数据库相关知识)

关系数据库系统与文件数据库系统的区别如下: (a)关系数据库系统的主要特征是数据的结构化,而文件数据库系统是数据的非结构化. (b)关系数据库系统中,用户看到的逻辑结构是二维表,而文件数据库系统中,基本元素是文件. (c)文件数据库系统可以实现多媒体文件管理,支持C/S工作模式. acid,指数据库事务正确执行的四个基本要素的缩写.包含:原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability). 数据查询:select sele