以前保證內存可見性都是使用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去掉,循環就會終止。