`
llyzq
  • 浏览: 578373 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java关键字之native,strictfp,transient,volatile

    博客分类:
  • J2SE
阅读更多

1. 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();   
}
  

 

为什么需要使用native method?请参考:
http://www.iteye.com/topic/72543 java Native Method初涉 

2. strictfp
修饰类和方法,意思是FP-strict,精确浮点。当JAVA虚拟机进行浮点运算时,如果没有指定strictfp关键字时,JAVA的编译器以及运行环境在对浮点运算的表达式是采取一种近似于我行我素的行为来完成这些操作,以致于得到的结果往往无法令你满意。而一旦使用了strictfp来声明一个类、接口或者方法时,那么所声明的范围内JAVA的编译器以及运行环境会完全依照浮点规范IEEE-754来执行。因此如果你想让你的浮点运算更加精确,而且不会因为不同的硬件平台所执行的结果不一致的话,那就请用关键字strictfp。。当一个class或interface用strictfp声明,内部所有的float和double表达式都会成为strictfp的。

注意:可以将一个类、接口以及方法声明为strictfp,但是不允许对接口中的方法以及构造函数声明strictfp关键字
 

strictfp interface FPTest {   
     
void
 methodA();   
}
   
class FPClass implements FPTest 
{   
    
public void methodA() 
{   
    }
   
    
public void methodB() 
{   
  }
   
  
public strictfp void methodC() 
{   
  }
   
}
   
class FPClassB 
{   
    strictfp 
void methodA() 
{   
    }
   
}
  

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


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

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

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

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

分享到:
评论

相关推荐

    java关键字.docx

    native:本地方法,用于定义一个使用本地语言实现的方法。 new:新建,用于创建一个新的对象。 null:空,用于表示一个空对象引用。 package:包,用于定义一个包。 private:私有,用于定义一个私有成员或方法。 ...

    JAVA笔试总结 -- 非常全面

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

    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

    strictfp-changes.pdf

    关于strictfp关键字的官方语法解释

    java面试800题

    instanceof, int, interface, long, native, new, package, private, protected, public, return, short, static, strictfp, super, switch, synchronized, this, throw, throws, transient, try, void, volatile, ...

    Learn.Java.for.Android.Development_Apress.2010+src

    Continuing, you investigate strictfp, class literals, synchronized, volatile, the enhanced for loop statement, autoboxing/unboxing, and transient fields. The book also briefly presents most (if not ...

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

    仿知乎java源码SevenBobcat-Java2CppTranslator 翻译器支持将受限版本的 Java 翻译成 C++。 源语言是 Java 的受限版本,没有高级功能,如嵌套类、匿名类、接口、枚举、注释、泛型、增强的 for 循环、可变参数、装箱/...

    JavaOOPTrainingCourse

    Java 关键字(静态、最终、strictfp)。 内部类和嵌套类。 抽象类。 第2课。 继承和封装。 第3课。 多态性。 InstanceOf 关键字。 异常(已检查、未检查、错误)。 编写自己的异常。 第 4 课。 接口(功能接口,...

    java 面试题 总结

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

    java学习总结 1.《Java核心技术》.rar

    Java中没有 3、移位操作符右边的参数要先进行模32运算(当左边的变元是long型,则模64),如1。浮点运算的中间结果程度是不一致的。有些处理器适用80bit浮点存储器,有些则使用64bit、80bit。直到最后才把结果截断为...

    java_demo:这是java_demo

    抽象const for int公共抛出断言继续最终接口返回抛出布尔值默认值最终长短瞬变中断做浮点数本地静态真字节双转到新strictfp尝试情况否则,如果null超级无效捕获枚举实现包开关volatile char扩展导入私有同步,而类...

    Learning-Java-Beginner-Level:开始学习 Java 时包含的练习

    --> JAVA IDENTIFIERS:- 用于类、变量和方法的名称称为标识符。 --> JAVA MODIFIERS:- 像其他语言... 有两类修饰符: 访问修饰符:default、public、protected、private 非访问修饰符:final、abstract、strictfp

    【05-面向对象(下)】

    则与之相反。 •包装类还可以实现基本类型变量和字符串之间的转换,除了Character之外的所有包装类都提供了一个 parseXxx(String s)静态方法。 •如果将基本类型转换为这符串,只需在后面加+ “”进行连接...

    Speed's IRC API-开源

    一个用于IRC开发的Java API,特别是为IRC bot开发的,但几乎可以用于任何与IRC相关的内容。 可以在irc.strictfp.com的#IRC频道上找到我们的IRC频道,希望在那里见到您!

Global site tag (gtag.js) - Google Analytics