`
crazyox
  • 浏览: 185114 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

strictfp 与 volatile

阅读更多

转自:http://hi.baidu.com/liyunqi1984/blog/item/0128921373d98b015aaf53eb.html

1. strictfp
修饰类和方法,意思是FP-strict,精确浮点,符合IEEE-754规范的。当一个class或interface用strictfp声明,内部所有的float和double表达式都会成为strictfp的。Interface method不能被声明为strictfp的,class的可以。
Example:

代码
  1. strictfp interface FPTest {   
  2.      void methodA();   
  3. }   
  4. class FPClass implements FPTest {   
  5.     public void methodA() {   
  6.       }   
  7.     public void methodB() {   
  8.   }   
  9.   public strictfp void methodC() {   
  10.   }   
  11. }   
  12. class FPClassB {   
  13.     strictfp void methodA() {   
  14.       }   
  15. }  

 

 

2.volatile
volatile修饰变量。在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
看看Java Language Specification中的例子。
条件:一个线程不停的调用方法one(),一个线程不停的调用方法two()。我测试过多次,这种情况好像一直没有出现。

 

代码
  1. class Test {   
  2.     static int i = 0, j = 0;   
  3.     static void one() { i++; j++; }   
  4.     static void two() {   
  5.           System.out.println("i=" + i + " j=" + j);   
  6.       }   
  7. }  


结果偶尔会出现j大于i的情况,因为方法没有同步,所以会出现i和j可能不是一次更新。一种防止这种情况发生的办法就是声明两个方法为synchronized 的。

代码
  1. class Test {   
  2.     static int i = 0, j = 0;   
  3.     static synchronized void one() { i++; j++; }   
  4.     static synchronized void two() {   
  5.           System.out.println("i=" + i + " j=" + j);   
  6.       }   
  7. }  


这样可以防止两个方法同时被执行,还可以保证j和i被同时更新,这样一来i和j的值一直是一样的。
另外一种途径就是把i和j声明为volatile。

代码
  1. class Test {   
  2.     static volatile int i = 0, j = 0;   
  3.     static void one() { i++; j++; }   
  4.     static void two() {   
  5.           System.out.println("i=" + i + " j=" + j);   
  6.       }   
  7. }  

 

 

分享到:
评论

相关推荐

    2022年Java入门系统Java基础知识部分总结.docx

    strictfp 和 volatile 不常用。sizeof 和 zhen 不是关键字。true、false、null 不是严格意义上的关键字,而是 literals。 5. Java 方法中的传递值参 在 Java 方法中传递参数,对于基本类型来说传递的是值参数,...

    JAVA笔试总结 -- 非常全面

    native,transient,volatile,strictfp,CMM,synchronized,java socket,压缩与解压缩,多线程,垃圾回收算法,JVM ClassLoader,IO流,反射机制,JNDI, GUI布局管理器,JMS, Java Mail, JNDI reference,java事件处理...

    java学习_java语法基础

    浮点数计算的精度问题可以通过使用strictfp关键字来控制,它确保浮点计算遵循FP-strict规则,保证跨平台的数值一致性。另一方面,transient关键字用于标记一个成员变量,表示该变量不应被序列化,即不会被保存在持久...

    java修饰词的总结.doc

    Java 语言中有多种修饰词,总共定义了 11 种,包括 public、protected、private、abstract、static、final、native、strictfp、synchronized、volatile 和 transient。这些修饰词可以应用于类、接口、成员、方法、...

    Java面试宝典2015

    transient与volatile关键字的理解 - **transient**:此关键字用于标记一个对象中的字段,在序列化时该字段会被忽略,即不会被持久化到磁盘或网络传输中。例如,在一个类`T`中,如果`a`字段被声明为`transient`,则...

    java面试题大全

    3. **抽象类与接口的区别**: - 抽象类是一种部分实现的类,可以包含抽象方法(没有实现的方法)和非抽象方法,一个类只能继承一个抽象类。 - 接口是完全抽象的,只能包含抽象方法和静态常量。一个类可以实现多个...

    JAVA常见面试题及解答

    - `volatile` 关键字用于确保多线程环境下的可见性与有序性。当一个变量被`volatile`修饰,它保证了任何线程对这个变量的修改都能立即被其他线程看到,避免了数据不一致的问题。它也禁止了指令重排序,确保在并发...

    Java编程中常用修饰词使用方法

    介绍:strictfp 修饰的类中所有的方法都隐藏了 strictfp 修饰词,方法执行的所有浮点计算遵守 IEEE 754 标准,所有取值包括中间的结果都必须表示为 float 或 double 类型,而不能利用由本地平台浮点格式或硬件提供的...

    java修饰词

    - 静态方法与类相关联,而不是实例,无法访问非静态成员。 - 静态初始化块在类加载时执行,而非实例化时。 4. **final**: - `final`修饰的类不能被继承,确保没有子类。 - final方法不能被重写,保证行为一致...

    JAVA学习笔记.pdf

    数组、向量Vector与字符串 数组是JAVA中的基本数据结构,数组的声明语法为:type 数组名 [] 或 type[] 数组名。数组的定义语法为:数组名= new type[长度]。 向量是JAVA中的容器类,向量的定义语法为:public ...

    java面试100题

    Java 中的关键字有 native、strictfp、transient 和 volatile 等。 1. native 修饰符,表示方法是由另外一种语言(如 c/c++,FORTRAN,汇编)实现的本地方法。 2. strictfp 修饰符,表示类或方法遵守 IEEE-754 规范...

    Java入门——Java修饰词总结

    它确保了线程间的可见性和有序性,即任何线程对`volatile`字段的修改对其他线程立即可见,且不会发生指令重排序。 11. **transient**: - 使用对象:字段 - 介绍:`transient`修饰符用于指定在序列化过程中不应被...

    深入浅出谈java修饰符共6页.pdf.zip

    - `strictfp`: 严格浮点,确保浮点计算在所有平台上具有可预测的结果,避免由于平台差异导致的浮点运算精度问题。 - `interface`: 接口,定义了一组抽象方法,用于实现多继承。Java 8引入了默认方法(用`default`...

    学会Java类型声明方法.doc

    - `volatile` 属性:多线程环境下确保可见性和有序性。 8. 方法声明: - 声明方法的基本语法是 `returnType methodName(参数列表) { methodBody }`。 - 访问修饰符、返回类型、方法名、参数列表和方法体是方法...

    java关键字.pdf

    3. 流程控制:strictfp、synchronized、break、continue、return、do、while、if、else、for、switch、case、default、catch、finally、throw、throws - strictfp用于类和方法,表示浮点运算要遵循IEEE 754标准。 - ...

    scjp310-065官方认证资料总结(精华)

    `volatile` 用于标记可能会被多个线程异步修改的变量。 综上所述,本文档涵盖了Java编程语言的基础和高级概念,包括但不限于标识符规则、关键字、JavaBean、多态性、设计原则等。对于准备SCJP310-065认证考试的学习...

    c++游戏程序员面试题

    - **Strictfp**:确保浮点运算的一致性。 - **Synchronized**:用于同步线程访问共享资源。 - **Transient**:用于序列化时忽略特定字段。 - **Instanceof**:运行时类型识别。 --- #### 游戏开发相关知识点 **...

    仿知乎java源码-Java2Cpp-Translator:Java到C++转换器

    循环、可变参数、装箱/拆箱、抽象类、同步方法和语句、strictfp、瞬态、 volatile、lambdas 等。 目标语言是 C++ 的受限版本,没有虚方法、继承、模板、lambda 抽象、auto、decltype 等。 翻译器主要对基本翻译建模...

    Java语言程序设计(Java语法基础)ppt.ppt.ppt

    包括abstract、boolean、break、byte、case、catch、char、class、const、continue、default、do、double...strictfp、super、switch、synchronized、this、throw、throws、transient、try、void、volatile等52个关键字...

    SpringSide 团队的编码规范

    - 修饰符顺序:public, protected, private, abstract, static, final, transient, volatile, synchronized, native, strictfp。 - 类和接口的声明顺序应遵循一定的结构,包括静态字段、静态初始化块、字段、初始...

Global site tag (gtag.js) - Google Analytics