`

Java不常用关键字native、volatile、transient简介

    博客分类:
  • Java
阅读更多

Java目前共有50个关键字,如下所列:

 

abstract	   continue	 for           new     	switch
assert***   default	         goto*	package	synchronized
boolean	   do                  if	        private	this
break	   double	         int	        protected	throw
byte   	   else	         import	public	throws     case	
enum****   instanceof	 return	transient  catch	extends	
implements  short	         try           char	         final 	interface
static	    void              class	finally	 long	        strictfp**
volatile         const*	         float	native	 super	while
/*-----------------------华丽的分割线--------------------------------------------*/
*	 	not used
**	 	added in 1.2
***	 	added in 1.4
****	added in 5.0	

 

 其中goto和const为保留字,目前版本中不会使用,而常见的三个看似是关键字的true, false, null,都不是关键字,而是作为一个单独标识类型。 

 

虽然一直用java,不过很多关键字还是没见过的,然后用也用不明白的,自己稍稍连copy带写总结一下吧~~~

 

看到CSDN上有人概括的说道:

 

 写道
native
当你需要调用本地程序的时候

transient
你的类实现了java.io.Serializable而你又不想保存某个字段的时候

volatile
这个字段会被其他线程(直接或者间接)访问到,而你想保证每个线程都能得到最新的数据
(性能上肯定有损耗的,为了安全牺牲性能的事情多着去了)

 

很容易理解~~

下面再贴上写例子,可以供自己闲来没事敲一敲,加深理解:

 

1、Native

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的关键字一共51个,包括访问控制修饰符(如public、private、protected)、控制流程关键字(如if、else、for、while)、数据类型...

    java中的关键字大全

    根据给定的部分内容,我们可以列出以下Java关键字: 1. **abstract** 2. **continue** 3. **for** 4. **new** 5. **switch** 6. **assert** 7. **default** 8. **if** 9. **package** 10. **synchronized** 11. **...

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

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

    Java关键字详细解

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

    java 关键字查询文档

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

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

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

    Java关键字大全 Java关键字大全

    在 Java 中,关键字是不可用作变量名、类名或方法名的保留标识。以下是一些主要的 Java 关键字的详细解释: 1. `abstract`: `abstract` 关键字用于声明抽象类或抽象方法。抽象类不能直接实例化,但可以被其他类继承...

    java51个关键字详解

    49. `with`:Java 15引入的新关键字,用于简化资源管理,但并不常用。 50. `yield`:Java 14引入的实验性关键字,用于线程上下文切换,让当前线程暂停,让其他线程有机会执行。 51. `_`(下划线):虽然不是关键字...

    Java的关键字与保留字

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

    java关键字

    ### Java关键字详解 #### 前言 Java作为一种广泛使用的编程语言,在软件开发领域占据了重要的地位。Java的关键字,即保留字,是Java语言中具有特殊意义的标识符,它们预定义并保留用于语言本身的语法结构。理解这些...

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

    Java关键字(也称为保留字)是指在Java语言中具有特殊含义的词,它们不能用作变量名、类名或方法名等标识符。以下是一些常见的Java关键字及其简单解释: 1. abstract: 表示抽象类或方法。 2. assert: 用于在代码中...

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

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

    Java关键字

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

    java保留字、关键字

    保留字是Java语言已经预定义并赋予特定含义的词汇,而关键字则是Java语法结构中不可或缺的部分。 Java的关键字包括: 1. `abstract`:用于声明抽象类或抽象方法。 2. `boolean`:数据类型,表示布尔值,只有两个值...

    java关键字、保留字

    Java关键字是由Java语言预定义的标识符,具有特殊的含义,不能用作变量名、方法名或类名等自定义标识符。本文将详细介绍Java中的关键字及其用途。 #### 关键字列表与解释 1. **abstract** - **用途**:用于声明...

    JAVA中的保留关键字

    Java关键字是指被Java语言本身赋予特定意义的标识符,它们不能作为变量名或类名等自定义标识符使用。Java中有53个关键字,包括但不限于: - `abstract`:用于声明抽象类和抽象方法。 - `boolean`:表示布尔类型,...

    JAVA关键字

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

    search_keyword12.rar_Java关键字

    Java关键字是编程的基础,它们是Java语言预定义的标识符,具有特定的含义和功能,不能用作变量名、方法名或类名。在Java中,关键字是保留给编译器使用的,它们对于理解程序的结构和控制流程至关重要。本文将深入探讨...

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

    下面是对Java关键字的详细总结,按照给出的部分内容进行排列: 1. `abstract`: - `abstract` 关键字用于声明抽象类或抽象方法。抽象类不能被实例化,只能作为其他类的基类。抽象方法没有具体的实现,必须在子类中...

Global site tag (gtag.js) - Google Analytics