JDK自帶線程池 線程池的狀態 線程有如下狀態 RUNNING狀態:Accept new tasks and process queued tasks SHUTDOWN狀態:Don't accept new tasks, but process queued tasks STOP狀態: Don't ...
轉自:
http://www.java265.com/JavaCourse/202111/1746.html
下文筆者講述volatile關鍵字的功能說明,如下所示:
Java volatile關鍵字功能: 使系統中所有線程對該關鍵字修飾的變數共用可見 可以禁止線程的工作記憶體對volatile修飾的變數進行緩存
可見性
當使用volatile關鍵字修飾變數時,它會保證修改的值會立即被更新到主存,當有其它線程需要讀取時,會從記憶體中讀取新值
//線程1 boolean stop = false; while(!stop){ doSomething(); } //線程2 stop = true;
以上代碼在多線程運行時,無法保證程式的終止, 需要原因是因為stop變數修改後,並不能立即寫入記憶體中 ----------------------------------------------- 線程1在運行時,會將stop變數的值拷貝一份放在自己的工作記憶體當中 那麼當線程2更改了stop變數的值之後,但是還沒來得及寫入主存當中 線程2轉去做其他事情了 但是線程1中的工作記憶體空間的stop變數值並未發生變化,所以程式會一直迴圈下去
綜上所述,我們可以得知volatile關鍵字的功能
- 使用volatile關鍵字會強制將修改的值立即寫入主存
- 使用volatile關鍵字的話,當線程2進行修改時,會導致線程1的工作記憶體中緩存變數stop的緩存行無效(反映到硬體層的話,就是CPU的L1或者L2緩存中對應的緩存行無效)
- 由於線程1的工作記憶體中緩存變數stop的緩存行無效,所以線程1再次讀取變數stop的值時會去主存讀取