java關鍵字synchronized的內存可見性

以前保證內存可見性都是使用volatile關鍵字,下面代碼的執行結果,讓我猜到了synchronized關鍵字可能會刷新線程的工作內存。

原來synchronized關鍵字也可以保證變量的內存可見性。因爲,

1、線程解鎖前,必須把共享變量的最新值刷新到主內存中; 
2、線程加鎖時,清空工作內存中共享變量的值,從而使共享變量是從主內存中重新讀取最新的值(加鎖與解鎖需要統一把鎖) 

線程執行互斥鎖代碼的過程: 
1.獲得互斥鎖 
2.清空工作內存 
3.從主內存拷貝最新變量副本到工作內存 
4.執行代碼塊 
5.將更改後的共享變量的值刷新到主內存中 
6.釋放互斥鎖 

所以這塊代碼,

      new Thread(() -> {
         while (i){
//                 System.out.println(i);
             synchronized ("a"){
                 int s=0;
             }
         }
      }).start();
        Thread.sleep(1000);
        i=false;

只要把註釋的sout去掉,循環就會終止。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章