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
相关文章推荐
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.3关键字(4.3.4-4.3.6)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.2面向对象技术(4.2.10-4.2.11)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.2面向对象技术(4.2.3-4.2.5)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.4基本类型与运算(4.4.1)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.7输入输出流(4.7.1-4.7.3)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.6异常处理(4.6.1-4.6.3)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.8 Java平台与内存管理(4.8.1-4.8.3)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.1基本概念(4.1.1)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.2面向对象技术(4.2.1-4.2.2)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.1基本概念(4.1.2)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.11Java数据库操作(4.11.1-4.11.8)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.10多线程(4.10.1-4.10.4)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.5字符串与数组(4.5.1-4.5.3)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.2面向对象技术(4.2.6)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.5字符串与数组(4.5.4-4.5.6)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.4基本类型与运算(4.4.5-4.4.10)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.7输入输出流(4.7.4-4.7.6)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.1基本概念(4.1.11-4.1.12)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.1基本概念(4.1.3)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.1基本概念(4.1.6-4.1.7)