转自: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:
代码
- strictfp interface FPTest {
- void methodA();
- }
- class FPClass implements FPTest {
- public void methodA() {
- }
- public void methodB() {
- }
- public strictfp void methodC() {
- }
- }
- class FPClassB {
- strictfp void methodA() {
- }
- }
2.volatile
volatile修饰变量。在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
看看Java Language Specification中的例子。
条件:一个线程不停的调用方法one(),一个线程不停的调用方法two()。我测试过多次,这种情况好像一直没有出现。
代码
- class Test {
- static int i = 0, j = 0;
- static void one() { i++; j++; }
- static void two() {
- System.out.println("i=" + i + " j=" + j);
- }
- }
结果偶尔会出现j大于i的情况,因为方法没有同步,所以会出现i和j可能不是一次更新。一种防止这种情况发生的办法就是声明两个方法为synchronized 的。
代码
- class Test {
- static int i = 0, j = 0;
- static synchronized void one() { i++; j++; }
- static synchronized void two() {
- System.out.println("i=" + i + " j=" + j);
- }
- }
这样可以防止两个方法同时被执行,还可以保证j和i被同时更新,这样一来i和j的值一直是一样的。
另外一种途径就是把i和j声明为volatile。
代码
- class Test {
- static volatile int i = 0, j = 0;
- static void one() { i++; j++; }
- static void two() {
- System.out.println("i=" + i + " j=" + j);
- }
- }
分享到:
相关推荐
strictfp 和 volatile 不常用。sizeof 和 zhen 不是关键字。true、false、null 不是严格意义上的关键字,而是 literals。 5. Java 方法中的传递值参 在 Java 方法中传递参数,对于基本类型来说传递的是值参数,...
native,transient,volatile,strictfp,CMM,synchronized,java socket,压缩与解压缩,多线程,垃圾回收算法,JVM ClassLoader,IO流,反射机制,JNDI, GUI布局管理器,JMS, Java Mail, JNDI reference,java事件处理...
浮点数计算的精度问题可以通过使用strictfp关键字来控制,它确保浮点计算遵循FP-strict规则,保证跨平台的数值一致性。另一方面,transient关键字用于标记一个成员变量,表示该变量不应被序列化,即不会被保存在持久...
Java 语言中有多种修饰词,总共定义了 11 种,包括 public、protected、private、abstract、static、final、native、strictfp、synchronized、volatile 和 transient。这些修饰词可以应用于类、接口、成员、方法、...
transient与volatile关键字的理解 - **transient**:此关键字用于标记一个对象中的字段,在序列化时该字段会被忽略,即不会被持久化到磁盘或网络传输中。例如,在一个类`T`中,如果`a`字段被声明为`transient`,则...
3. **抽象类与接口的区别**: - 抽象类是一种部分实现的类,可以包含抽象方法(没有实现的方法)和非抽象方法,一个类只能继承一个抽象类。 - 接口是完全抽象的,只能包含抽象方法和静态常量。一个类可以实现多个...
- `volatile` 关键字用于确保多线程环境下的可见性与有序性。当一个变量被`volatile`修饰,它保证了任何线程对这个变量的修改都能立即被其他线程看到,避免了数据不一致的问题。它也禁止了指令重排序,确保在并发...
介绍:strictfp 修饰的类中所有的方法都隐藏了 strictfp 修饰词,方法执行的所有浮点计算遵守 IEEE 754 标准,所有取值包括中间的结果都必须表示为 float 或 double 类型,而不能利用由本地平台浮点格式或硬件提供的...
- 静态方法与类相关联,而不是实例,无法访问非静态成员。 - 静态初始化块在类加载时执行,而非实例化时。 4. **final**: - `final`修饰的类不能被继承,确保没有子类。 - final方法不能被重写,保证行为一致...
数组、向量Vector与字符串 数组是JAVA中的基本数据结构,数组的声明语法为:type 数组名 [] 或 type[] 数组名。数组的定义语法为:数组名= new type[长度]。 向量是JAVA中的容器类,向量的定义语法为:public ...
Java 中的关键字有 native、strictfp、transient 和 volatile 等。 1. native 修饰符,表示方法是由另外一种语言(如 c/c++,FORTRAN,汇编)实现的本地方法。 2. strictfp 修饰符,表示类或方法遵守 IEEE-754 规范...
它确保了线程间的可见性和有序性,即任何线程对`volatile`字段的修改对其他线程立即可见,且不会发生指令重排序。 11. **transient**: - 使用对象:字段 - 介绍:`transient`修饰符用于指定在序列化过程中不应被...
- `strictfp`: 严格浮点,确保浮点计算在所有平台上具有可预测的结果,避免由于平台差异导致的浮点运算精度问题。 - `interface`: 接口,定义了一组抽象方法,用于实现多继承。Java 8引入了默认方法(用`default`...
- `volatile` 属性:多线程环境下确保可见性和有序性。 8. 方法声明: - 声明方法的基本语法是 `returnType methodName(参数列表) { methodBody }`。 - 访问修饰符、返回类型、方法名、参数列表和方法体是方法...
3. 流程控制:strictfp、synchronized、break、continue、return、do、while、if、else、for、switch、case、default、catch、finally、throw、throws - strictfp用于类和方法,表示浮点运算要遵循IEEE 754标准。 - ...
`volatile` 用于标记可能会被多个线程异步修改的变量。 综上所述,本文档涵盖了Java编程语言的基础和高级概念,包括但不限于标识符规则、关键字、JavaBean、多态性、设计原则等。对于准备SCJP310-065认证考试的学习...
- **Strictfp**:确保浮点运算的一致性。 - **Synchronized**:用于同步线程访问共享资源。 - **Transient**:用于序列化时忽略特定字段。 - **Instanceof**:运行时类型识别。 --- #### 游戏开发相关知识点 **...
循环、可变参数、装箱/拆箱、抽象类、同步方法和语句、strictfp、瞬态、 volatile、lambdas 等。 目标语言是 C++ 的受限版本,没有虚方法、继承、模板、lambda 抽象、auto、decltype 等。 翻译器主要对基本翻译建模...
包括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个关键字...
- 修饰符顺序:public, protected, private, abstract, static, final, transient, volatile, synchronized, native, strictfp。 - 类和接口的声明顺序应遵循一定的结构,包括静态字段、静态初始化块、字段、初始...