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

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

    博客分类:
  • java
阅读更多
Java关键字(keywords)
      abstract    default    if            private      this
      boolean     do         implements    protected    throw
      break       double     import        public       throws
      byte        else       instanceof    return       transient
      case        extends    int           short        try
      catch       final      interface     static       void
      char        finally    long          strictfp     volatile
      class       float      native        super        while
      const       for        new           switch
      continue    goto       package       synchronized
以上是java specifications中定义的keywords,一共48个,其中常见的三个看似是关键字的true, false, null,都不是关键字,而是作为一个单独标识类型。
其中,不常用到的关键字有:const,goto,native,strictfp,transient,volatile。
const和goto为java中的保留字。

1. native
native是方法修饰符。Native方法是由另外一种语言(如c/c++,FORTRAN,汇编)实现的本地方法。因为在外部实现了方法,所以在java代码中,就不需要声明了,有点类似于借口方法。Native可以和其他一些修饰符连用,但是abstract方法和Interface方法不能用native来修饰。
Example:
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修饰类或方法,可以确保浮点运算(以及所有切断)正如早期的Java版本那样准确。切断只影响某些操作的指数。当一个类被strictfp修饰,所有的方法自动被strictfp修饰。
    strictfp的意思是FP-strict,也就是说精确浮点的意思。在Java虚拟机进行浮点运算时,如果没有指定strictfp关键字时,Java的编译器以及运行环境在对浮点运算的表达式是采取一种近似于我行我素的行为来完成这些操作,以致于得到的结果往往无法令你满意。而一旦使用了strictfp来声明一个类、接口或者方法时,那么所声明的范围内Java的编译器以及运行环境会完全依照浮点规范IEEE-754来执行。因此如果你想让你的浮点运算更加精确,而且不会因为不同的硬件平台所执行的结果不一致的话,那就请用关键字strictfp。
你可以将一个类、接口以及方法声明为strictfp,但是不允许对接口中的方法以及构造函数声明strictfp关键字,例如下面的代码:
合法的使用关键字strictfp
strictfp interface A {}

public strictfp class FpDemo1 {
    strictfp void f() {}
}


错误的使用方法

interface A {
    strictfp void f();
}

public class FpDemo2 {
    strictfp FpDemo2() {}
}

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

3.transient
   如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。例如:
class T {
   transient int a;  //不需要维持
   int b;  //需要维持
}

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

4. 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 的。
Java代码
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关键字、保留字

    Java的关键字是构成Java程序的基础元素之一,正确理解和运用这些关键字对于编写高质量的Java程序至关重要。每个关键字都有其特定的用途和语法规则,熟悉它们可以帮助开发者更好地控制程序的行为和逻辑结构。

    Java关键字

    Java关键字是编程的基础,它们是Java语言预定义的标识符,具有特殊含义并被Java编译器识别。在Java中,一共有51个关键字(包括保留字),但描述中提到的是48个,可能是因为某些关键字在特定上下文不常用或者被归类到...

    java 关键字查询文档

    Java 共有 50 多个关键字,它们包括但不限于 `abstract`、`assert`、`boolean`、`break`、`byte`、`case`、`catch`、`char`、`class`、`const`(虽然未使用)、`continue`、`default`、`do`、`double`、`else`、`...

    java关键字

    理解这些关键字是学习Java的基础之一。本文将详细介绍Java中的50个常用关键字,并按照其功能类别进行分类。 #### 数据类型相关关键字 (10个) 1. **byte**: 表示8位带符号的整数类型。 2. **short**: 表示16位带符号...

    java关键字,适合新手的ppt

    修饰符如`private`, `public`, `protected`定义了访问权限,`final`, `static`, `abstract`, `native`, `synchronized`, `volatile`, `strictfp`, `transient`分别用于定义不可变对象、静态成员、抽象方法、本地方法...

    JAVA关键字

    Java关键字是编程的基础,它们是Java语言预定义的、具有特殊含义的标识符,不能作为变量名、方法名或类名。以下是对50个Java关键字的详细解释: 1. **abstract**:用于声明抽象类或抽象方法,不包含具体实现。 2. ...

    java关键字和java命名规范.pdf

    Java关键字和命名规范是Java编程语言中的基础概念,它们对于编写清晰、规范的代码至关重要。Java关键字是Java语言内置的、具有特殊用途的保留字,而命名规范则是关于如何给类、方法、变量等命名的约定。 ### Java...

    Java关键字的用法

    `native`关键字用于标记本地方法,这些方法是由非Java语言(如C/C++)实现的。 **示例:** ```java public native void nativeMethod(); ``` #### 30. `new` `new`关键字用于创建新对象。 **示例:** ```java ...

    java关键字.pdf

    Java关键字是Java语言中预先定义的、具有特殊意义的单词,它们在Java程序中有着特殊的用途,比如用来声明数据类型、定义流程控制语句等。根据提供的部分内容,可以将Java的关键字分类并阐述它们的作用。 1. 访问...

    JAVA关键字,很详细的总结。

    ### JAVA关键字,很详细的总结。 在Java编程语言中,关键字是具有特定意义的预定义标识符,它们在语言结构和语法中扮演着关键角色。以下是对Java关键字的详细解析,旨在帮助开发者深入理解并有效利用这些核心概念。...

    最完整的java关键字解释.doc

    ### 最完整的Java关键字解释 #### 1. Abstract - **定义**:`abstract`关键字用于修饰类或方法,表示该类或方法具有抽象属性。 - **用途**: - `abstract`类可以被继承,但是不能被实例化。 - `abstract`方法不...

    java关键字整理

    掌握这些关键字对于理解Java语法至关重要,同时也是成为一名合格Java开发者的基石之一。本文将详细介绍Java中的50个关键字,通过具体的例子帮助读者更好地理解和应用这些关键字。 #### A系列关键字 - **abstract**...

    Java的关键字与保留字

    在深入探讨Java的关键字与保留字之前,我们首先需明确两个概念:关键字和保留字。在编程语言中,关键字是预定义的具有特殊含义的标识符,它们在编译时被解析器识别并执行特定的功能;而保留字则是语言设计者为未来...

    java关键字............

    ### Java关键字详解 #### 概述 Java是一种广泛使用的面向对象编程语言,它以其平台无关性、健壮性和安全性而闻名。Java中的关键字是预定义的保留字,具有特殊的意义和用途,不能用作标识符(如变量名、类名等)。在...

    (完整版)最完整的java关键字解释.doc

    Java 关键字是Java编程语言中的预定义词汇,它们具有特殊含义,用于构建程序的不同方面。以下是Java关键字的详细解释: 1. `abstract`:这个关键字用于声明抽象类或抽象方法。抽象类不能直接实例化,它必须由至少一...

Global site tag (gtag.js) - Google Analytics