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

native,transient,volatile,strictfp

    博客分类:
  • J2SE
阅读更多

1.transient (暂时的)
变量修饰符标记为transient的变量,在对象存储时,这些变量状态不会被持久化。当对象序列化的保存在存储器上时,不希望有些字段数据被保存,为了保证安全性,可以把这些字段声明为transient。 

class T {   
   transient int a;  //不需要维持   
   int b;  //需要维持   
}  

 

 

这里,如果T类的一个对象写入一个持久的存储区域,a的内容不被保存,但b的将被保存。
 

2.native(本地的)
native是方法修饰符。Native方法是由另外一种语言(如c/c++,FORTRAN,汇编)实现的本地方法。因为在外部实现了方法,所以在java代码中,就不需要声明了,有点类似于接口方法。Native可以和其他一些修饰符连用,但是abstract方法和Interface方法不能用native来修饰。
 

public interface TestInterface {   
     void doMethod();   
}   
public class Test implements TestInterface {   
    public native void doMethod();   
    private native int doMethodB();   
  public native synchronized String doMethodC();   
  static native void doMethodD();   
}  

 

 

3.volatile (易失的)
volatile修饰变量。在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。


volatile修饰符告诉编译器被volatile修饰的变量可以被程序的其他部分改变。在多线程程序中,有时两个或更多的线程共享一个相同的实例变量。考虑效率问题,每个线程可以自己保存该共享变量的私有拷贝。实际的变量副本在不同的时候更新,如当进入synchronized方法时。volatile有时 可以代替synchronized。


看看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);   
    }   
} 

 

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);   
    }   
}  

 

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);   
    }   
}  

 


4.strictfp(精确浮点)
参看http://zhoujingxian.iteye.com/admin/blogs/698205

分享到:
评论

相关推荐

    JAVA笔试总结 -- 非常全面

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

    JAVA学习笔记.pdf

    其中,修饰符可以是static、abstract、final、native、strictfp、synchronized等,结果类型是方法的返回类型,方法名是方法的名称,参数列表是方法的参数列表,throws子句是方法可能抛出的异常。 成员方法的修饰符...

    java修饰词的总结.doc

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

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

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

    java面试100题

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

    Java基础标识符关键字数据类型PPT教案学习.pptx

    private、public、protected、final、static、abstract、synchronized、volatile、strictfp、native、transient 等修饰符关键字;try、catch、finally、throw、throws 等异常处理关键字;new、extends、implements、...

    java修饰词

    - `strictfp`修饰符确保浮点计算遵循IEEE 754标准,避免因平台差异导致的精度问题。 - 适用于需要严格一致性的科学计算场景。 9. **synchronized**: - `synchronized`用于方法或代码块,用于控制多线程环境中的...

    Java入门——Java修饰词总结

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

    SpringSide 团队的编码规范

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

    java关键字.pdf

    2. 类、方法和变量修饰符:abstract、final、static、transient、volatile - abstract表示抽象类或方法,抽象类不能实例化,抽象方法必须在子类中实现。 - final表示最终的,用于类表示不可继承,用于方法表示不可...

    99乘法表java源码-biji:课堂笔记

    99乘法表java源码 ls 查看目录下文件 java规则 代码都定义在类中,用class...char fianlly native strictfp void class float new super volatile continue for null switch while default if package enum synchroniz

    JAVA程序设计课件-变量.pptx

    * transient * native * strictfp * ... 四、运算符 Java中的运算符是用于执行数学运算、逻辑运算、赋值运算等操作的符号。Java中的运算符有: * 算术运算符:+、-、\*、/、%、++、-- * 赋值运算符:=、+=、-=、\...

    JAVA学习笔记[参考].pdf

    方法修饰符如`static`、`abstract`、`final`、`native`、`strictfp`和`synchronized`分别表示静态方法、抽象方法、不可覆盖的方法、本地方法、浮点计算精确度和同步方法。 - 非`private`的方法可以被子类继承,方法...

    java修饰符介绍

    - **native**:声明方法是原生方法,其实现由C/C++或其他本地库提供,通过JNI(Java Native Interface)调用。 - **synchronized**:同步方法,确保同一时间只有一个线程可以执行该方法,用于线程安全。 - **...

    基础标识符关键字数据类型PPT课件.pptx

    - **方法、变量和类修饰符**:private、public、protected、final、static、abstract、synchronized、volatile、strictfp、native和transient,这些修饰符用于控制访问权限、确定变量和方法的特性,以及类的实现方式...

    修饰符

    6. native, strictfp和transient: - `native`: 用于表示方法是用其他语言(如C++)实现的,Java本身不提供实现。 - `strictfp`: 用于确保浮点运算的精确性,遵循IEEE 754标准,避免平台差异带来的计算结果不一致。...

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

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

    统计你的项目中所有java文件中有效代码量,注解量及空行数

    1. 有效代码:`^[\t ]*(class|interface|void|public|private|protected|import|static|final|abstract|transient|volatile|synchronized|native|strictfp|default|yield|async|await)[\t ]+.+` 2. 注解:`^[\t ]*@...

    Java的关键字与标识符小结

    9. 其他关键字:包括native、strictfp、transient、volatile、assert、goto、const和enum等8个关键字。 标识符是用户在编程时给类、变量、常量、方法(函数)、语句块等起的名字。Java语言中标识符不包括关键字,而...

Global site tag (gtag.js) - Google Analytics