Javaコールドゲートキーワード
native
修飾オブジェクトしゅうせいおぶじぇくと:メソッドほうほう
機能:
1)JVM上で実行されるコードがローカルプログラムまたはクラスライブラリを呼び出すことを許可する.これらのプログラムまたはクラスライブラリは、Cなどの非Java言語で記述することができる.
元の定義は次のとおりです.
"A native method is a Java method whose implementation is provided by non-java code."
2)JVMのコードは、下位ハードウェアまたはオペレーティングシステムを直接操作することができる.
nativeメソッドはインタフェースに似ており,Java外部の環境を理解する必要がなく,直接呼び出すことができる.一つのnative方法の具体的な実現はJVMから直接提出する 使用するか、またはダイナミックリンクライブラリによって提供され、その後JVMによって呼び出されます.
使用時:
プログラムがJavaを完全に使用して実現できない場合、JNI(Java Native Interface)を使用してローカルメソッドを記述することができます.
動作原理:
ローカル関数は一般に独立したファイルの形式で実現される(.cファイルなど).JVMがこの関数を呼び出すと、JNIEnvポインタ、jobjectポインタ、Javaメソッドで定義されたJavaパラメータが渡されます.
JNI関数の形式は次のとおりです.
JNIEXPORT void JNICALL Java_ClassName_MethodName(JNIEnv *env, jobjectobj) {
//Method native implemenation
}
例:
public class Test {
public native void nativeMethod();
}
nativeキーを使用する場合は、次の点に注意してください.
1)nativeメソッドはインプリメンテーションを提供しない.
これはよく分かります.native修飾の方法は非Java言語で実現され,外部実装に属するため,nativeメソッドは呼び出しの方式を提供するだけである. それを実現するのではありません.しかしnative法は実装体がないわけではないことに注意しなければならない.
2)nativeはabstract識別子と連用できない
abstractは、この方法がサブクラスによって提供されることを示す.一方nativeは,この方法が実装されたことを示しているが,外部実装であるため,具体的な実装はJava世代ではない. コードに現れているだけです.両者の概念は反発するので、自然と一緒に使うことはできません.
参照:http://www.ibm.com/developerworks/cn/java/j-jni/
strictfp
修飾オブジェクトしゅうせいおぶじぇくと:メソッド、クラスメソッド、クラス
すべての式の浮動小数点数が厳格なFP制限規則を遵守することを指摘する
ps:
システムに浮動小数点演算のハードウェアコンポーネントが含まれている場合、浮動小数点パラメータは次のルールに従って渡されます.各浮動小数点パラメータは順番に処理されます.各浮動小数点パラメータにFPレジスタを割り当てる.割り当て方法は、この浮動小数点パラメータを満たすために必要な最小番号の一連の連続FPレジスタである.第1の整数パラメータはレジスタR 0~R 3を介して伝達され、その他のパラメータはデータスタックを介して伝達する.
transient
オブジェクトが永続的にシリアル化されないようにします.オブジェクトをシリアル化すると、transientフィールドは常にスキップされます.
volatile
変数が変更され、同期が失われ、マルチスレッドで使用される可能性があることを示します.
volatileの1つの機能は、アプリケーションの可視性を確保することです.たとえば、1つのプロパティをvolatileとして宣言し、このプロパティを書き込み操作すると、すべての読み取り操作にこの変更が表示されます.ローカルキャッシュを使用しても同様です.volatile修飾のプロパティは、書き込み操作時にプライマリ・メモリに書き込まれ、読み取り操作はプライマリ・メモリに発生するためです.すなわち、マルチスレッドが属性にアクセスする場合、この属性はvolatileであるべきであり、そうでない場合、synchronizedメソッドまたは文ブロックを使用して保護する必要があります.
前述したようにvolatile修飾属性に新しい値を付与する場合、付与操作は原子的であることに注意してください.したがって,volatileを用いてこの属性を修飾するだけで原子操作の効果を達成できる.ただし、インクリメントなどの操作は原子操作ではありません.原子性を保証するにはsynchronizedを使用します.
p.s.操作が原子的であるかどうかは,コンパイル後のバイトコードから見ることができる.例えば、i++、Cプログラミングの経験のあるプログラマーはこの操作を原子操作とするのに慣れていますが、Javaでは自増などの操作は原子ではありません.バイトコードは次のとおりです.
getfield
iconst_1
iadd
putfield
getとput命令には他の命令があることがわかる.