用多線程的目的:更好的利用CPU的資源。因為所有的多線程代碼都可以用單線程來實現。
多線程:指的是這個程序(一個進程)運行時產生了不止一個線程。
並行:多個CPU實例或者多台機器同時執行一段處理邏輯,是真正的同時。
並發:通過CPU調度算法,讓用戶看上去同時執行,實際上從CPU操作層面不是真正的同時。
線程安全:經常用來描繪一段代碼。指在並發的情況下,該代碼經過多線程使用,線程的調度順序不影響任何結果。這個時候使用多線程,我們只需要
關注系統的內存,CPU是不是夠用即可。
線程不安全:線程的調度順序會影響最終結果,如不加事務的轉賬代碼。
同步:Java中的同步指的是通過人為的控制和調度,保證共享資源的多線程訪問稱為線程安全,來保證結果的准確。在保證結果准確的同時,提高性能,才是優秀的程序。
線程安全的優先級高於性能。
Java的並發采用的是共享變量模型
Java線程之間的通信由Java內存模型控制,JMM決定一個線程對共享變量的寫入何時對另一個線程可見。
從圖中可以看出,如果線程A與線程B之間要通信的話,必須要經歷下面兩個步驟:
1、線程A把本地內存A中更新過的共享變量刷新到主內存中去。
2、線程B到內存中去讀取線程A之前已更新過的共享變量。
可通過下面例子來說明這兩個步驟:
如圖所示,本地內存A和本地內存B由主內存中共享變量x的副本。假設在最開始時,這3個內存中的x值都為0。線程A在執行時,把更新后的x值(假設值為1)臨時存放在自己的本地內存A中。
當線程A和線程B需要通信時,線程A首先會把自己本地內存中修改后的x值刷新到主內存中,此時主內存中的x值變為1.隨后,線程B到主內存中去讀取線程A更新后的x值,此時線程B的本地內
存的x值也變為1。
從整體來看,這兩個步驟實質上是線程A在向線程B發送消息,而且這個通信過程必須要經過主內存。JMM通過控制主內存與每個線程的本地內存之間的交互,來為Java程序員提供內存可見性保證。
參考資料:http://www.jianshu.com/p/40d4c7aebd66