JavaマルチスレッドにおけるvolatileとSynchronizedの違い

ここに画像の説明を挿入

揮発性

2つのキーワードvolatileとsynchronizeは、並行プログラミングでは珍しくなく、次のように理解できます。揮発性は軽量同期ですJavaマルチスレッドは、メンバー変数またはオブジェクトに同時にアクセスする複数のスレッドをサポートしているため、両方のキーワードシェア変数の可視性を保証可視性は、スレッドが共有変数を変更し、共有変数が操作された後に別のスレッドが値を読み取る場合です
。jdkバージョンの反復により、同期キーワードも非常に適切に最適化されます。

Volatileの実装原理

Javaでは、複数のスレッドが共有リソースにアクセスしてスレッドの安全性と一貫性を確保できます。ロックオブジェクトを介してリソースを個別に取得するスレッドは
、ロックよりも便利な場合があります。変数が揮発性として宣言されている場合、すべてのスレッドがこの変数の値を参照しますすべて一貫している

揮発性キーワードの役割

volatileキーワードの役割は、命令の順序変更を禁止し、スレッドのプライベートデータスタックから変数値をフェッチするのではなく、パブリックスタックから変数値を強制的にフェッチします。

同期済み

同期コードブロック、同期方法はプロジェクトで非常に一般的です。役割は、マルチスレッド操作の共有リソースの一貫性とアトミック性を
確保して、1つのスレッドだけが同時に共有リソースにアクセスできるようにし、他のスレッドはブロックフェーズにあり、スレッドの実行が完了するか、例外が発生した後で
のみ、ロックオブジェクトが解放されます。他のスレッドは、次のラウンドのCPU実行権(タイムスライス)を獲得できます。

同期原理

Synchronizedは重いロックとして批判されていますが、対照的に、ロックほど柔軟で便利ではありません。具体的な使用法については、上記のJavaマルチスレッドのスレッドセーフティを参照してください。

注意!

  • ロックを使用する場合は、最終的にロックを解放する必要があります。そうしないと、デッドロックが発生する傾向があります。同期を使用する場合は心配しないでください。ロック取得スレッドは、同期コードの実行後にロックを解放します。または、実行スレッドが異常な場合は、JVMがロックオブジェクトを解放します。
  • ロックを使用する場合、スレッドは永遠に待機しません。同期を使用する場合、スレッドAがオブジェクトロックを取得した後、他のスレッドはブロッキングフェーズに入り、永久に待機します
  • 同期は暗黙のロックであり、必要です。同期されたリソースがこのコントロールに追加されますAnd Lockは表示ロックであり、同期されたリソースの前後に追加する必要がありますロックの取得とロック操作の解除

同期する方法

同期コードブロック、オブジェクトは任意の型にすることができ
、括弧内も記述この、現在のロックオブジェクトが現在のクラスオブジェクトであることを表す

public class RunnableImpl implements Runnable {
 
    // 定义一个多个线程共享票源
    private int ticket = 30;

    // 创建锁对象
    Object obj = new Object();

    /**
     * 卖票
     */
    @Override
    public void run() {
        while (true) {
            // 创建同步代码块
            synchronized (obj) {
                // 先判断票是否存在
                if (ticket > 0) {
                    // 存在
                    System.out.println(Thread.currentThread().getName() + "--->正在卖票" + ticket + "张票");
                    ticket--;
                }
            }
        }
    }
}

同期メソッド。メソッドの上にsynchronizedキーワードを追加し
ますロックオブジェクトは現在のクラスのインスタンスです

public class RunnableImpl implements Runnable {

    // 定义一个多个线程共享票源
    private int ticket = 100;

    /**
     * 卖票
     */
    @Override
    public void run() {
        while (true) {
            updateTicket();
        }
    }
    // 同步方法
    public synchronized void updateTicket() {
        // 先判断票是否存在
        if (ticket > 0) {
            // 存在
            System.out.println(Thread.currentThread().getName() + "--->正在卖票" + ticket + "张票");
            ticket--;
        }
    }
}

揮発性と同期の違い

ここに画像の説明を挿入

  • volatileはスレッドのブロッキングを引き起こさず、同期はスレッドのブロッキングを引き起こします
  • volatileは変数のみを変更でき、synchronizedは同期されたコードブロックとメソッドを変更できます
  • volatileは原子性を保証できません(スレッドの安全性は保証できません)、synchronizedは原子性を保証できます
  • volatileは、複数のスレッド間の共有リソースの問題を解決します可視性、同期すると、複数のスレッド間で共有リソースにアクセスする問題が解決されます同期
元の記事24件を公開 賞賛された33件 訪問2391件

おすすめ

転載: blog.csdn.net/weixin_41241629/article/details/104460593
おすすめ