您的位置:首页 > 职场人生

Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.3关键字(4.3.7-4.3.9)

2017-06-05 21:42 696 查看

4.3.7volatile有什么作用

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

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。

4.3.8instanceof有什么作用

instanceof是Java语言中的一个二元运算符,它的作用是判断一个引用类型的变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例(可以用来识别标识接口),即它左边的对象是否是它右边的类的实例,该运算符返回boolean类型的数据。

常见的用法为:result = object instanceof class。如果object是class的一个实例,那么instanceof运算符返回true;如果object不是class的一个实例,或者object是null,那么instanceof运算符返回false。

以如下程序为例:

public class Test{
public static void main(String[] args){
String s = "Hello";
int[] a = {1,2};
if(s instanceof String)
System.out.println("true");
if(s instanceof Object)
System.out.prubtln("true");
if(a instanceof int[])
System.out.println("true");


程序运行结果为:

true

true

true

4.3.9strictfp有什么作用

关键字strictfp是strict float point的缩写,指的是精确浮点,它用来确保浮点数运算的准确性。JVM在执行浮点数运算时,如果没有指定strictfp关键字,此时计算结果可能会不精确,而且计算结果在不同平台或厂商的虚拟机上会有不同的结果,导致意想不到的错误。而一旦使用了strictfp来声明一个类、接口或者方法,那么在所声明的范围内,Java编译器以及运行环境会完全按照IEEE二进制浮点数算数标准来执行,在这个关键字声明的范围内所有的浮点数的计算都是精确的,需要注意的是,当一个类被strictp修饰时,所有方法都会自动被strictfp修饰。因此,strictfp可以保证浮点数运算的精确性,而且在不同的硬件平台会有一致的运行结果。示例如下:

public strictfp class Test {

public static void testStrictfp(){
float f = 0.12365f;
double d = 0.03496421d;
double sum = f + d;
System.out.println(sum);
}

public static void main(String[] args){
testStrictfp();
}
}


运行结果:

0.15861420949932098
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐