一、線程基本概念
1. 同步和異步
同步:調用者必須等被調用者返回了結果後,纔可以執行接下來的操作。
異步:調用者無需等到被調用者返回結果後才能執行。被調用者可以異步執行。
2. 併發和並行
併發:某一具體時刻只有一個線程運行,而在一個時間範圍內,看到的是多線程一起執行的假象。
並行:某一時刻存在大於一個線程的多個線程在執行,真正的同時執行。
3. 臨界區
臨界區:多個線程共享的公共資源。但是一旦有一個線程佔用了臨界區資源,則其他線程都需要等待。
4. 阻塞和非阻塞
阻塞:如果一個線程佔用了臨界區資源,而其他線程也需要這個資源,那麼其他線程需要等待。等待會導致線程掛起,這個時候線程會阻塞。
非阻塞:沒有一個線程會妨礙其他線程執行。
5. 死鎖、飢餓、活鎖
死鎖:A佔用了臨界資源1,B佔用了臨界資源2,此時線程A需要獲取資源2才能執行,與此同時線程B需要資源1才能執行。
飢餓:一個線程因爲獲取不到必要的資源而導致長時間無法執行的狀態。
活鎖:和死鎖很像,線程A釋放資源1的同時線程B釋放資源2,而線程A搶到資源2的同時,線程B搶到資源1。
6 線程和進程
線程:程序執行的最小單位。
進程:可以容納多個線程,是正在運行的.exe程序。
7. 線程的狀態
就緒:剛創建的線程,等待start()調用。
運行:獲得CPU執行權。
阻塞:遇到synchronized代碼塊,等到其他線程釋放鎖。
等待:當調用wait()方法後,等待notify()方法。
死亡:線程執行結束。
二、線程的三性
1. 原子性:一個操作正在運行時是不會被另一個線程干擾的。對於32位Java虛擬機來說,由於long類型是64位,讀寫不是原子性的,因此可能出現不一致的結果。
2. 可見性:一個線程修改了某一個共享變量的數值,其他線程能否感知到這次修改。
3. 有序性:就一個線程或者同一個線程內,代碼運行時有序的。但是如果是多個線程,那麼線程之間是交替執行的,沒有統一的順序。
下一章 線程基本概念(二):https://mp.csdn.net/console/editor/html/107094199