1、同步 和 異步
同步 和 異步描述方法的調用。
同步:方法調用一旦開始,調用者必須等到方法調用返回後,才能繼續後續的行爲。 串行的進行方法的調用。
異步方法調用更像一個消息傳遞,一旦方法調用就會立即返回。
2、併發和並行
併發:多個任務交替執行。
並行:多個CPU的系統上,多個CPU同時執行任務。
3、臨界區:
用來表示公共資源或者公共數據。可以被多個線程同時使用,但是每一次,只能有一個線程使用它。 可以共享的代碼或者資源。
4、阻塞和非阻塞
用來形容多線程間的相互影響。
一個線程佔用了臨界區資源,那麼其他所有需要這個資源的線程就必須在這個臨界區中進行等待。等待導致線程掛起,這種情況就是阻塞。
非阻塞的意思與之相反,它強調沒有一個線程可以妨礙其他線程執行。所有線程都會嘗試不斷前行。
5、死鎖 、 飢餓、 活鎖
都屬於多線程的活躍性問題。
死鎖 兩個或者兩個以上的線程,由於資源競爭或者彼此通信造成的一種阻塞現象。
飢餓 某一個或者多個線程因爲種種原因無法獲得所需要的資源,導致一直無法執行。
活鎖 兩個任務執行沒有阻塞,但在獲取的資源的時候彼此“謙讓”,而導致無法具備執行的條件。 由於某些條件沒有滿足,導致一直重複嘗試,失敗,嘗試,失敗。
6、併發級別:
併發級別可以分爲如下幾類: 阻塞 無飢餓 無障礙 無鎖 無等待。
阻塞:一個線程是阻塞的,那麼在其他線程釋放資源之前,當前線程無法執行。
無飢餓: 線程之間是優先級的,那麼線程調度的時候,總會傾向於滿足高優先級的線程。如果鎖是公平,滿足先來後到,那麼飢餓就不會發生。阻塞有些線程不能執行,無飢餓就是所有的線程都能夠執行,阻塞的情況會產生飢餓。
無障礙,是一種最弱的非阻塞調度。兩個線程如果是無障礙的執行,那麼他們不會因爲臨界區的問題導致一方被掛起。換言之,大家都可以大搖大擺地進入臨界區。如果一起修改共享數據,把數據該壞了怎麼辦呢?對於無障礙的線程來說,一旦檢測到這種情況,他就會立即對自己所做的修改進行回滾。
無鎖: 無鎖的並行都是無障礙的。在無鎖的情況下,所有的線程都能嘗試對臨界區進行訪問,但不同的是,無鎖的併發保證比必然有個線程能夠在有限步內完成操作離開臨界區。
無等待:要求所有的線程都必須在有限步內完成。
7、原子性 可見性 有序性
原子性:是指一個操作是不可中斷的。即使是在多個線程一起執行的時候,一個操作一旦凱斯,就不會被其他線程干擾。
有序性 程序在執行時,可能會進行指令重排,重排後的指令與原指令的順序未必一致。
可見性 當一個線程修改了某一個共享變量的值,其他線程是否能夠立即知道這個修改。
8、Happen-Before原則:
程序順序原則:一個線程內保證語義的串行性。
volatile規則:volatile變量的寫,先發生於讀,這保證了volatie變量的可見性。
鎖規則:解鎖必然發生在隨後的加鎖前
傳遞性: A先於B,B先於C,那麼A必然先於C。
線程的start方法先於它的每一個動作。
線程的所有操作先於線程的終結。
線程的中斷先於被中斷線程的代碼
對象的構造函數執行、結束先於finalize方法