Java 는 키워드 native,volatile,transient 프로필 을 자주 사용 하지 않 습 니 다.

자바 에는 현재 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 은 모두 키워드 가 아니 라 단독 표지 유형 입 니 다. 
 
자 바 를 계속 사용 하지만,많은 키 워드 는 아직 보지 못 했 습 니 다.그리고 사용 해도 모 르 는 것 을 사용 합 니 다.자신 이 조금 만 copy 테이프 로 정 리 를 해 보 세 요~~~
 
CSDN 에서 어떤 사람 이 개괄적 으로 말 하 는 것 을 보 았 다.
 
 쓰다
native
로 컬 프로그램 을 호출 해 야 할 때
transient
당신 의 클래스 는 자바.io.Serializable 을 실현 하 였 으 며,당신 이 어떤 필드 를 저장 하고 싶 지 않 을 때
volatile
이 필드 는 다른 스 레 드(직접 또는 간접)에 접근 할 수 있 으 며,모든 스 레 드 가 최신 데 이 터 를 얻 을 수 있 도록 보장 하고 싶 습 니 다.
(성능 에 손실 이 있 을 거 야.안전 을 위해 성능 을 희생 하 는 일이 많아.)
 
이해 하기 쉬 워 요.
다음 에 예 를 붙 여서 한가 할 때 두 드 리 지 않 고 깊이 이해 할 수 있 습 니 다.
 
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 라 고 가정 하면 Object OutputStream 을 통 해 이러한 인 스 턴 스 를 디스크 에 저장 할 때 실제 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);   
  }   
}   
 

좋은 웹페이지 즐겨찾기