UnsafeはJavaロックフリー操作の基礎であり、ロックフリーの並行性クラスでは不可欠です。たとえば、CONCURRENTHASHMAPとCONCURRENTLINKEDQUEUEはすべて、安全でないクラスによって実装されます。 JavaのLocksと比較して、基本的にオーバーヘッドがなく、所定の位置に待機します。この記事では、主に主な操作を安全ではありません。
1 Compareandswap
/*** OBJのオフセットでのメモリ位置の値と期待値を比較し、同じ場合は更新します。この更新は中断できません。 **更新する必要がある@Param OBJオブジェクト アップデート);
これは有名なCAS操作であり、3つのステップに分かれています
CASファミリーには、compareandswapobject()、compareandswaplong()、compareandswapint()なども含まれています。
AtomicIntegerの古典的な例を使用して、次のように説明します。
public final int getandadd(int delta){return unsafe.getandaddint(this、value offset、delta);} // unsafe.getandaddintpublic final int getandaddint(object var1、long var2、int var4){int var5; { / **元の値を取得* / var5 = this.getIntvolatile(var1、var2); / **元の値が他のスレッドによって変更されていないことを確認してから、var5 + var4操作を更新*/} while(!this.compareandswapint(var1、var5、var5、var5 + var4)); var5を返します;}2プットオーダー
/****指定されたオブジェクトの指定されたオフセットで整数フィールドの値を指定された値に設定します。これは、<code> putintvolatile(object、long、int)</code>の順序付けられたまたは怠zyな *バージョンであり、他の *スレッドへの変更の即時の可視性を保証しません。整数フィールドが * <code> volatile </code>である場合にのみ非常に有用であり、したがって、予期せず変更されると予想されます。 * * @param obj変更するフィールドを含むオブジェクト。 * @paramは、<code> obj </code>内の整数フィールドのオフセットをオフセットします。 * @param値フィールドの新しい値。 * @see #putintvolatile(object、long、int) */ public native void putorderedint(object obj、long offset、int value);
Javaにはメモリ操作がないため、OBJオブジェクトのオフセットが値にオフセットされる位置を変更し、この操作の操作は不十分なメモリ動作を補完するだけです。また、多数の使用のために並行ハッシュマップなどのアレイ操作にも使用できます
セグメント<k、v> s0 =新しいセグメント<k、v>(loadfactor、(int)(cap * loadfactor)、(hashentry <k、v> [])new Hashentry [cap]);セグメント<k、v> [] ss =(segment <k、v> [])新しいセグメント[ssize]; //配列が0に添えられる位置にs0を書き込みます:ss [0] = s0 unsafe.putorderedobject(ss、sbase、s0); //セグメントの注文書[0]
OBJを揮発性に設定する必要があることに注意する必要があります。そうしないと、他のスレッドには見えません。
3 putxxxvolatile
/**** integerフィールドの値を、指定されたオブジェクトの指定されたオフセットで、揮発性ストアセマンティクスを使用して、指定された値に提供します。 * * @param obj変更するフィールドを含むオブジェクト。 * @paramは、<code> obj </code>内の整数フィールドのオフセットをオフセットします。 * @param値フィールドの新しい値。 */ public Native void putintvolatile(オブジェクトobj、ロングオフセット、int値);
PutOrderintと同じように感じます。なぜなら、それは揮発性に設定する必要があるからです。そうでなければ何が用途ですか?
上記は、今回私があなたと共有したすべての知識ポイントです。 wulin.comへのご支援ありがとうございます。