進程:運行在他自己的地址空間的自包容程序。
線程:進程中的單一順序控制流、子任務。
daemon後臺線程:非後臺線程結束,殺死所有後臺線程,並結束整個程序。
變量實例對象存於主存;每個線程私有一個工作內存,同時只能操作自身工作內存,不能訪問其他線程的工作內存。
由此引發,併發編程三個常見問題。
原子性
一個操作或者多個操作,要麼都執行,要麼都不執行,且中途無法打斷。
可見性
多個線程訪問同一個變量,變量發生了修改,其他線程能夠同步修改。
有序性
程序執行順序應該按照代碼的先後順序執行。
但由於處理器指令重排,多線程情況,應該有可能發生變數,導致執行結果與代碼順序不一致。
32位long和double會發生字撕裂,讀寫無法保證原子性。
併發編程一定要同時保證這三個問題解決,否者就發生意料之外的問題。
volatile
被volatile修飾的變量,保證不同線程的可見性;同時內存柵欄的方式禁止指令重排序。
但是volatile不保證原子性。
synchronized可同時保證原子性、可見性、有序性。