Java中的transient,volatile和strictfp关键字

Java中的transient,volatile和strictfp关键字 
    如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。例如:
Java代码
?
1
2
3
4
class T {
    transient int a;   //不需要维持
    int b;   //需要维持
}

这里,如果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
Java代码
?
1
2
3
4
strictfp interface A {}
public strictfp class FpDemo1 {
     strictfp void f() {}
}

2. 错误的使用方法
Java代码
?
1
2
3
4
5
6
interface A {
     strictfp void f();
}
public class FpDemo2 {
     strictfp FpDemo2() {}
}

一旦使用了关键字strictfp来声明某个类、接口或者方法时,那么在这个关键字所声明的范围内所有浮点运算都是精确的,符合IEEE-754规范的。例如一个类被声明为strictfp,那么该类中所有的方法都是strictfp的。 



Keys: volatile 

使用对象:字段 

介绍:因为异步线程可以访问字段,所以有些优化操作是一定不能作用在字段上的。volatile有时 

可以代替synchronized。 




Keys:transient 

  使用对象:字段 

  介绍:字段不是对象持久状态的一部分,不应该把字段和对象一起串起。
本文转自 http://caoruntao.iteye.com/blog/1100041





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java关键字是被保留的,不能用作标识符。如果需要在程序使用关键字作为标识符,可以使用反引号将其包围。例如,如果需要使用关键字class作为标识符,可以写成`class`。 如果需要存储和屏蔽关键字,可以使用字符串数组来存储所有的关键字。在需要使用关键字的地方,可以通过判断该标识符是否在关键字数组来确定是否为关键字,从而进行屏蔽。 以下是一个示例代码: ```java String[] keywords = {"abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "default", "do", "double", "else", "enum", "extends", "final", "finally", "float", "for", "if", "implements", "import", "instanceof", "int", "interface", "long", "native", "new", "package", "private", "protected", "public", "return", "short", "static", "strictfp", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "try", "void", "volatile", "while"}; String identifier = "class"; if (Arrays.asList(keywords).contains(identifier)) { identifier = "`" + identifier + "`"; } System.out.println(identifier); // 输出:`class` ``` 在上述代码,我们首先定义了一个字符串数组,包含所有Java关键字。然后,我们定义了一个标识符,为了演示,我们使用了关键字class作为标识符。接着,我们使用Arrays.asList()方法将关键字数组转换为List,然后使用contains()方法判断标识符是否在关键字数组。如果是关键字,我们就将标识符用反引号包围。最后,我们输出标识符,观察结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值