`
yixiaodiguo
  • 浏览: 3010 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java中的native,transient,volatile关键字

    博客分类:
  • java
 
阅读更多

1,native是方法修饰符。

Native方法是由另外一种语言(如c/c++,FORTRAN,汇编)实现的本地方法。一般用于JNI中。

 

public class testdll
{
     static{
           System.loadLibrary("test");
     }

     public native static int get();

     public native static void set(int i);

     public static void main(String[] args){
        testdll test = new testdll();
        test.set(10);
        System.out.println(test.get());
     }
}

test.dll可以用VC写,例如,
-----testdll.h-----
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class testdll */

#ifndef _Included_testdll
#define _Included_testdll
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: testdll
* Method: get
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_testdll_get
(JNIEnv *, jclass);

/*
* Class: testdll
* Method: set
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_testdll_set(JNIEnv *, jclass, jint);

#ifdef __cplusplus
}
#endif
#endif


-------testdll.c-----------
#include "testdll.h"

  int i = 0;

  JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass){
     return i;
  }

  JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j){
      i = j;
  } 

 2,transient

transient是一个变量修饰符,标记为transient的变量,在对一个对象进行序列化时,这些变量状态不会被序列化。

例如,假设某个类的成员变量是transient,那么当通过ObjectOutputStream把这个类的某个实例保存到磁盘上时,实际上transient变量的值是不会保存的。

当对象序列化的保存在存储器上时,不希望有些字段数据被保存,为了保证安全性,可以把这些字段声明为transient。

要更明白,可以看一些序列化的内容。

 

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

 

 

分享到:
评论

相关推荐

    JAVA中的保留关键字

    ### JAVA中的保留关键字 在Java编程语言中,关键字与保留关键字是极其重要的组成部分,它们定义了语言的基本结构和语法规则。对于初学者来说,熟悉这些关键字对于理解和编写正确的Java程序至关重要。 #### 关键字...

    java中的50个关键字.docx

    ### Java中的50个关键字详解 #### 一、引言 Java作为一种广泛使用的编程语言,在其语法体系中定义了一系列关键字,这些关键字具有特定的意义和用途,对于理解和编写Java程序至关重要。本文将详细介绍Java中与数据...

    java中的关键字大全

    ### Java中的关键字大全 在Java编程语言中,关键字是一组预定义的词汇,它们具有特殊的含义和用途。理解和掌握这些关键字对于编写有效的Java程序至关重要。本文将详细介绍Java中的一些核心关键字,并提供相应的解释...

    源码关键字统计.rar

    在Java编程语言中,关键字是预定义的、具有特殊含义的词汇,它们是构成程序语法结构的基础元素。这篇关于“源码关键字统计”的主题旨在分析Java源代码文件,并计算其中出现的关键字数量。这个任务涉及到文件读取、...

    电子教材:《Java语言程序设计-关键字》pdf版(高清晰)

    根据《Java语言程序设计-关键字》pdf版电子教材,下面列出了Java语言中的所有关键字及其简要解释: 1. **abstract** - 表示抽象类或抽象方法,抽象类不能被实例化,只能通过继承的方式实现其具体功能。 2. **...

    java中“53”个关键字(含2个保留字)

    在Java编程语言中,关键字是具有特殊含义的预定义标识符,它们被Java解析器用来识别语法结构。这些关键字不能用作变量名、类名或方法名。在Java中,一共有53个关键字,包括两个保留字。下面将详细阐述这些关键字的...

    Java关键字详细解

    这篇文档《Java关键字详细解》将深入探讨Java中的关键字及其用途。 首先,我们来看看Java中的主要关键字。`public`、`private`、`protected`是访问修饰符,用于控制类、方法和变量的访问权限。`public`可以被任何...

    Java基础之关键字_Java基础之关键字_源码

    在编程语言的学习中,了解和掌握关键字是至关重要的一步,特别是在Java这种强类型的语言中。本文将深入探讨Java中的关键字,这些关键字是Java语法结构的基础,它们被Java编译器特殊处理,有着特定的含义和功能。 ...

    Java关键字

    在Java中,一共有51个关键字(包括保留字),但描述中提到的是48个,可能是因为某些关键字在特定上下文不常用或者被归类到保留字中。下面将详细介绍这些关键字及其用途。 1. **abstract** - 用于声明抽象类或抽象...

    JAVA中的关键字和保留字

    Java是一种广泛使用的面向对象的编程语言,其语法严谨,其中包括一系列的关键字和保留字,这些关键字在编程中具有特殊含义,不能用作变量名或其他标识符。以下是对Java中一些重要关键字的详细解释: 1. **abstract*...

    java保留字、关键字

    在Java编程语言中,保留字(Reserved Words)和关键字(Keywords)是两个非常重要的概念,它们构成了Java语法的基础。保留字是Java语言已经预定义并赋予特定含义的词汇,而关键字则是Java语法结构中不可或缺的部分。...

    java 关键字查询文档

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

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

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

    java关键字

    Java的关键字,即保留字,是Java语言中具有特殊意义的标识符,它们预定义并保留用于语言本身的语法结构。理解这些关键字是学习Java的基础之一。本文将详细介绍Java中的50个常用关键字,并按照其功能类别进行分类。 ...

    01-Java语言基础(关键字)

    以上仅是Java关键字的一部分,还有许多其他关键字,如`synchronized`, `volatile`, `transient`, `native`, `strictfp`等,它们各自承担着特定的功能。理解和熟练使用这些关键字是成为一名合格的Java程序员的基础。...

    Java中的保留字和关键字.doc

    ### Java中的保留字和关键字详解 #### 一、引言 在编程语言中,关键字(Keyword)和保留字(Reserved Word)是具有特殊含义的重要组成部分。对于Java这门广泛使用的面向对象编程语言而言,理解其关键字与保留字的...

    java关键字、保留字

    本文将详细介绍Java中的关键字及其用途。 #### 关键字列表与解释 1. **abstract** - **用途**:用于声明抽象类和抽象方法。抽象类不能实例化,只能作为其他类的父类。抽象方法是没有实现的方法,必须在子类中提供...

    Java标识符、关键字和保留字

    - 修饰方法、类、属性和变量关键字:如`static`、`final`、`native`、`synchronized`、`transient`、`volatile`、`strictfp`,用于提供额外的信息来修饰类、方法和变量。 - 异常处理关键字:如`try`、`catch`、`...

    Java的关键字与保留字

    Java拥有51个关键字,这些关键字在编程中扮演着核心角色,用于声明类型、控制流程、异常处理等。下面我们将逐一介绍这些关键字: 1. **abstract**:用于定义抽象类和抽象方法,表示该类不能被实例化,或方法没有...

    JAVA关键字总结(整理后最全最详细)

    在Java编程语言中,关键字是具有特殊含义的保留词汇,它们是编程语法的重要组成部分。下面是对Java关键字的详细总结,按照给出的部分内容进行排列: 1. `abstract`: - `abstract` 关键字用于声明抽象类或抽象方法...

Global site tag (gtag.js) - Google Analytics