複数のスレッド間での視認性を確認し、それが揮発性として宣言されています

  参考ます。https://www.cnblogs.com/duanxz/p/6097779.html

 

コードをコピー
com.testパッケージ; 

インポートsun.misc.Unsafe; 

をjava.lang.reflect.Fieldとしてインポート; 

パブリッククラスCASLearn { 
    プライベート静的最終的な安全でない危険; 
    プライベートロング最終静的nameOffset; 
    プライベートロング最終静的valueOffset; 
    プライベートロング最終静的intffset; 

    / /複数のスレッド間での視認性を確保するためには、揮発性として宣言されていますが、この例では、シングルスレッドで
    プライベート揮発性の文字列名; 
    プライベート揮発ロング値、
    プライベート揮発int型年齢、

    静的{ 
        試み{ 
            //危険なUnsafe.getUnsafeは(直接呼び出すことはできません)のみ信頼クラスにアクセスするには、この方法を例を取得します。
            ///反射による危険取得し 
            フィールドF = Unsafe.class.getDeclaredField( "theUnsafe" ); //内部リファレンス
            、(真の)f.setAccessible 
            危険=(安全でない)f.get(NULL)。

            コードの//オフセット静的ブロックは、各属性を初期化
            「//CASLearn.class.getDeclaredField("value)を原因値属性は、クラスローディング機構のJavaで得ることができる:
            //参照します。https://blog.csdn / m0_38075425 / Articleこの記事.NETた/詳細/ 81627349 
            負荷1. @:バイナリストリームクラスを読み込み、データ構造格納された値クラスメソッドエリア、そして新しいクラスオブジェクト、クラスを参照するために使用されるデータ構造
            // 2。検証:クラスバイトストリームがファイルは、仮想マシンの現在の要件に沿った情報が含まれていることを確実にするために、仮想マシンは、自分自身の安全を危険にさらすことはありません。4つの認証、検証ファイル形式、メタデータの検証、バイトコード検証、シンボリック参照の検証含む
            3】@を:クラスの静的変数のためのメモリを割り当てて、デフォルトの初期値を設定します。(中間初期値は0)
            // 4.分析:バイナリデータクラスを直接引用したシンボリック参照置換
            5.初期化@:クラス割り当て静的変数に上から下へ、静的コードブロックは、静的実行するステップを含みます 
            intffset = unsafe.objectFieldOffset(CASLearn.class.getDeclaredField( "年齢"))。 
            valueOffset = unsafe.objectFieldOffset(CASLearn.class.getDeclaredField( "値 "));
            nameOffset = unsafe.objectFieldOffset(CASLearn.class.getDeclaredField( "名前")); 
        }キャッチ(ないNoSuchFieldException | IllegalAccessExceptionが電子){ 
            新しいエラー(e)を投げます。
        } 
    } 

    プライベートCASLearn(文字列名、長い値、int型の年齢){ 
        this.name =名。
        this.value =値。
        this.age =年齢; 
    } 

    @Override 
    パブリック文字列のtoString(){ 
        リターン"名:" +名+ "年齢" +年齢+ "値" +値。
    } 

    パブリック静的無効メイン(文字列[] args){ 
        CASLearn CAS =新しいCASLearn( "DH"、100L、18)。
        //原子操作:修改年齢18-> 19
        unsafe.compareAndSwapInt(CAS、intffset、18、19)。
        //原子操作、値的值为100L、200L不是、所以不修改
        unsafe.compareAndSwapLong(CAS、valueOffset、200L、999L)。
        //原子操作、修改"DH" - > "hiahiahia" 
        unsafe.compareAndSwapObject(CAS、nameOffset、 "DH"、 "hiahiahia"); 
        //结果为:名前:hiahiahia age19 value100 
        のSystem.out.println(CAS); 
    }

おすすめ

転載: www.cnblogs.com/struohnssebxsc/p/11243549.html