1. 程式人生 > >工作執行緒併發例子

工作執行緒併發例子

**
 * Description 這個類作用是什麼
 * Author WEISANGENG
 * Date 2018/10/1
 **/
public class VolatileTest extends Thread {
    boolean flag = false;
    int i = 0;

    public void run() {
        while (!flag) {
            i++;
        }
    }

    public static void main(String[] args) throws Exception {
        VolatileTest vt = new VolatileTest();
        vt.start();
        Thread.sleep(2000);
        vt.flag = true;
        System.out.println("stope" + vt.i);
    }
}

該例子執行未退出,考慮一下為什麼?

可以看下如下的內容:

java 主記憶體和執行緒中的工作執行緒

在 java 垃圾回收整理一文中,描述了jvm執行時刻記憶體的分配。其中有一個記憶體區域是jvm虛擬機器棧,每一個執行緒執行時都有一個執行緒棧,


執行緒棧儲存了執行緒執行時候變數值資訊。當執行緒訪問某一個物件時候值的時候,首先通過物件的引用找到對應在堆記憶體的變數的值,然後把堆記憶體


變數的具體值load到執行緒本地記憶體中,建立一個變數副本,之後執行緒就不再和物件在堆記憶體變數值有任何關係,而是直接修改副本變數的值,


在修改完之後的某一個時刻(執行緒退出之前),自動把執行緒變數副本的值回寫到物件在堆中變數。這樣在堆中的物件的值就產生變化了。下面一幅圖


描述這寫互動!