揮発性のさらなる反射

で、深さのプロセスで揮発性のキーワードを理解することは、いくつかの以前に学習していない知識がありましたが、これらの知識は、揮発性の私の認識に影響を与える、以下の知識ポイントのいくつかの並べ替えを行います

MESIは何ですか

アドレスはスピードの問題は一致しないために、多くのコンピュータがキャッシュに使用しています。CPUとメモリの速度のミスマッチの問題に対処するために、キャッシュがありました。コンピュータでマルチコアCPUにおいて、各CPUは、それ自身の個別のキャッシュを持っています。あなただけの読み取りまたはシングルコアの場合場合は、キャッシュ内の一貫性のないデータは表示されません。書き込みキャッシュは、唯一可能な矛盾がある場合にのみ。監査は、CPUが唯一の原因ではない本質的ではありません。しかし、キャッシュは複数の共有データ・キャッシュが発生している間。CPUはによって引き起こされるので、だから、この問題に対処する、CPUメーカーは独自のソリューションは、CPUキャッシュハードウェアレベルの層で行います。彼らはさまざまなキャッシュの中にある独立しているが、これは、MESIであるが、彼らは公共のバスです。各キャッシュは、任意のバス動作をスニッフィング保たれています。自身のキャッシュ内のデータが失敗した場合、または別の状態に変更されるように、メモリ内のデータを読み取るためのバスを介してライトバッファは、他のキャッシュが同期されます。そのキャッシュに変更は、メモリに同期していない場合は、この時間は、どのようにそれを行うには?実際には、あなたは、前方の状態を変更するためにそれらを可能にするために、キャッシュの無効化修飾によりバスの前に他を知らせるためにあるとき、CPUキャッシュ変更通知を、ステップ実行することができます。

:詳細については、を参照してくださいhttps://www.infoq.cn/article/cache-coherency-primer

すでに私たちは、揮発性、それはどのような使用MESIですか?

MESIキャッシュは、これだけの一貫性を確保するが、他のキャッシュの中でCPUにメモリからします。また、ハードウェアアーキテクチャのサポートMESIのすべての可視性の問題ではなく、そこになります。volatileキーワードのJavaの役割は、すべてのキャッシュ(例えばレジスタ)とみなすことができるが読み込まれ、直接メインメモリを動作させる書き込み、揮発性の共有変数のために変更、(信頼できないと考えられる)は無効です。これは根本的に矛盾を解消します。

なぜ、揮発性の再注文を禁止すべきこと

  • 並べ替えは、シングルスレッドの場合には、実装の最終結果に影響を与えないことを確認する必要があります。

まず並べ替え意志の命令として-IF-シリアルセマンティクスに従って、並べ替えは、コンパイル時に発生するJavaの並べ替え。目的は、効率を向上させることにある並べ替え、彼は相互作用キャッシュの数を減らすために一緒に入れ、同じ変数の操作のためにしようとします。

第二に、プロセッサは、プロセッサの加算器及び除算器などの技術は、同時に実行可能な唯一の命令レベル並列で並べ替え、現在の処理を行います。したがって、同じ分割指示時刻と加算命令を並列に実行、が、2つのADD命令の実行順序を必要とすることができます。効果的にCPUを利用するためには、ハードウェアレベルでの並べ替えを行います。

問題の順序を変更することはシングルスレッドの場合には発生しませんが、マルチスレッドの場合には問題があるでしょう。たとえば、シングルトンはダブルを達成するためにロックをチェックします。

public class Singleton {

    private volatile static Singleton singleton;

    private Singleton(){}

    public static Singleton getInstance() {
        // 这里主要原因是synchronized是一个重量操作,这样可以减少锁操作
        if (singleton == null) {
            // 如果不加锁的话,就会出现线程1判断了为null以后,时间片切换了,然后线程2来判断也为null的情况
            synchronized (Singleton.class) {
                // 如果不判断的话,当线程1和线程2同时过来,线程1获取了锁资源,线程2挂起到等待队列,等线程1执行完释放锁以后,线程2也会创建
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
    
}

ここでは役割に加えて揮発性のシングルトン=新しいシングルトン();ないアトミック操作。彼は、発生する可能性があり並べ替え。たとえば、メモリを申請し、その後、メモリアドレスを変数に返されます。しかし、この時間は、使用に戻り、是非、あるnullではない別のスレッドシングルトンを発見するなど、インスタンス化されていません。しかし、オブジェクトがまだ完了してインスタンス化され、この時点では、問題があるでしょう。これは、並べ替えによって引き起こされる問題です。揮発性の役割は、並べ替えを禁止することです。

参照

https://blog.csdn.net/aigoogle/article/details/40793947

https://www.jianshu.com/p/35e4504d42e4

おすすめ

転載: www.cnblogs.com/colin-xun/p/11550028.html