Javaキーワードvolatileの詳細

1532 ワード

  • 概要皆さんはvolatileというキーワードを聞いたことがあると思いますが、多くの人がどのように使うか分からないと思います.今、私は皆さんに私の理解を話します.何か間違っていることがあれば、指摘してほしいです.ついでに勉強させてください.ここで私にこれらの知識点を学ばせてくれた大物たちに感謝します.彼らの無私な奉仕こそ、私に収穫を与えることができます.まず、volatileが何をしているのかを理解するには、javaのメモリモードが何なのかを知る必要があります.この大物のブログを見てみましょう.
    https://www.cnblogs.com/dolphin0520/p/3920373.html
  • 構成環境JITまたはHotSpotコンパイラは、serverモードとclientモードでコンパイルが異なり、serverモードはスレッドの実行を高速化するため、一方のスレッドが変数boolean flagの値を変更すると、他方のスレッドは見えなくなります.他方のスレッドは、実行を高速化するためにレジスタまたはローカルcacheから値を取ります.メモリから値を取るのではなく、volatileを使用すると、volatileによって修飾された変数は、どのスレッドでもメモリから値を取るように伝えられます.『メモリフェンス』
  • テストコード
    public class HelloWorld {
        boolean flag = true;
    	Executor executor = Executors.newFixedThreadPool(4);
    	public static void main(String[] args) {
    		new HelloWorld().run();
    	}
    	void run(){
    		executor.execute(new T1());
    		executor.execute(new T2());
    	}
    	
    	class T1 implements Runnable{
     
    		public void run() {
    			while(flag){
    				int i = 0 ;
    				System.out.println(i++);
    			}
    		}
    	}
    	class T2 implements Runnable{
    		public void run(){
    			while(flag){
    				try {
    				Thread.sleep(1000);
    				 flag = false ;
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    }
    
  • まとめ(1)javaはclientモードではマルチスレッドで変数を読み取ると、メインメモリから直接読み取り、ワークメモリ(キャッシュ)に保存されず、volatileを付けない効果はすべて同じですが、serverモードではjava仮想マシンを最適化し、直接キャッシュで読み取り、現在の方法を実行した後、キャッシュを解放します.(2)スレッドに同期ブロックが存在する場合、メインメモリを強制的に除去してメインメモリの値を再取得するため、synchronizeとlockも共有変数の可視性を満たす.

  • eclipseを使用してテストしないでください.eclipseモードで使用するclientモードです.