若是用transient声明一个实例变量,当对象存储时,它的值不须要维持。例如:
多线程
class T { 函数
transient int a; //不须要维持 优化
int b; //须要维持 spa
} .net
这里,若是T类的一个对象写入一个持久的存储区域,a的内容不被保存,但b的将被保存。
volatile修饰符告诉编译器被volatile修饰的变量能够被程序的其余部分改变。在多线程程序中,有时两个或更多的线程共享一个相同的实例变量。考虑效率问题,每一个线程能够本身保存该共享变量的私有拷贝。实际的变量副本在不一样的时候更新,如当进入synchronized方法时。
用strictfp修饰类或方法,能够确保浮点运算(以及全部切断)正如早期的Java版本那样准确。切断只影响某些操做的指数。当一个类被strictfp修饰,全部的方法自动被strictfp修饰。
strictfp的意思是FP-strict,也就是说精确浮点的意思。在Java虚拟机进行浮点运算时,若是没有指定strictfp关键字时,Java的编译器以及运行环境在对浮点运算的表达式是采起一种近似于我行我素的行为来完成这些操做,以至于获得的结果每每没法令你满意。而一旦使用了strictfp来声明一个类、接口或者方法时,那么所声明的范围内Java的编译器以及运行环境会彻底依照浮点规范IEEE-754来执行。所以若是你想让你的浮点运算更加精确,并且不会由于不一样的硬件平台所执行的结果不一致的话,那就请用关键字strictfp。
你能够将一个类、接口以及方法声明为strictfp,可是不容许对接口中的方法以及构造函数声明strictfp关键字,例以下面的代码:
1. 合法的使用关键字strictfp
线程
strictfp interface A {} 对象
public strictfp class FpDemo1 { 接口
strictfp void f() {}
}
2. 错误的使用方法
interface A {
strictfp void f();
}
public class FpDemo2 {
strictfp FpDemo2() {}
}
一旦使用了关键字strictfp来声明某个类、接口或者方法时,那么在这个关键字所声明的范围内全部浮点运算都是精确的,符合IEEE-754规范的。例如一个类被声明为strictfp,那么该类中全部的方法都是strictfp的。
Keys: volatile
使用对象:字段
介绍:由于异步线程能够访问字段,因此有些优化操做是必定不能做用在字段上的。volatile有时
能够代替synchronized。
Keys:transient
使用对象:字段
介绍:字段不是对象持久状态的一部分,不该该把字段和对象一块儿串起。