Java 併發程式設計 基礎 一

2021-08-02 23:53:55 字數 1432 閱讀 6212

同步 和 非同步描述方法的呼叫。

同步:方法呼叫一旦開始,呼叫者必須等到方法呼叫返回後,才能繼續後續的行為。 序列的進行方法的呼叫。

非同步方法呼叫更像乙個訊息傳遞,一旦方法呼叫就會立即返回。

併發:多個任務交替執行。

並行:多個cpu的系統上,多個cpu同時執行任務。

用來表示公共資源或者公共資料。可以被多個執行緒同時使用,但是每一次,只能有乙個執行緒使用它。 可以共享的**或者資源。

用來形容多執行緒間的相互影響。

乙個執行緒占用了臨界區資源,那麼其他所有需要這個資源的執行緒就必須在這個臨界區中進行等待。等待導致執行緒掛起,這種情況就是阻塞。

非阻塞的意思與之相反,它強調沒有乙個執行緒可以妨礙其他執行緒執行。所有執行緒都會嘗試不斷前行。

都屬於多執行緒的活躍性問題。

死鎖 兩個或者兩個以上的執行緒,由於資源競爭或者彼此通訊造成的一種阻塞現象。

飢餓 某乙個或者多個執行緒因為種種原因無法獲得所需要的資源,導致一直無法執行。

活鎖 兩個任務執行沒有阻塞,但在獲取的資源的時候彼此「謙讓」,而導致無法具備執行的條件。 由於某些條件沒有滿足,導致一直重複嘗試,失敗,嘗試,失敗。

併發級別可以分為如下幾類: 阻塞 無飢餓 無障礙 無鎖 無等待。

阻塞:乙個執行緒是阻塞的,那麼在其他執行緒釋放資源之前,當前執行緒無法執行。

無飢餓: 執行緒之間是優先順序的,那麼執行緒排程的時候,總會傾向於滿足高優先順序的執行緒。如果鎖是公平,滿足先來後到,那麼飢餓就不會發生。阻塞有些執行緒不能執行,無飢餓就是所有的執行緒都能夠執行,阻塞的情況會產生飢餓。

無障礙,是一種最弱的非阻塞排程。兩個執行緒如果是無障礙的執行,那麼他們不會因為臨界區的問題導致一方被掛起。換言之,大家都可以大搖大擺地進入臨界區。如果一起修改共享資料,把資料該壞了怎麼辦呢?對於無障礙的執行緒來說,一旦檢測到這種情況,他就會立即對自己所做的修改進行回滾。

無鎖: 無鎖的並行都是無障礙的。在無鎖的情況下,所有的執行緒都能嘗試對臨界區進行訪問,但不同的是,無鎖的併發保證比必然有個執行緒能夠在有限步內完成操作離開臨界區。

無等待:要求所有的執行緒都必須在有限步內完成。

原子性:是指乙個操作是不可中斷的。即使是在多個執行緒一起執行的時候,乙個操作一旦凱斯,就不會被其他執行緒干擾。

有序性 程式在執行時,可能會進行指令重排,重排後的指令與原指令的順序未必一致。

可見性 當乙個執行緒修改了某乙個共享變數的值,其他執行緒是否能夠立即知道這個修改。

程式順序原則:乙個執行緒內保證語義的序列性。

volatile規則:volatile變數的寫,先發生於讀,這保證了volatie變數的可見性。

鎖規則:解鎖必然發生在隨後的加鎖前

傳遞性: a先於b,b先於c,那麼a必然先於c。

執行緒的start方法先於它的每乙個動作。

執行緒的所有操作先於執行緒的終結。

執行緒的中斷先於被中斷執行緒的**

物件的建構函式執行、結束先於finalize方法

Java併發程式設計一

不要用run 來開啟執行緒,它只會在當前執行緒中,序列執行run 方法中的 建立執行緒時,推薦傳入runnable介面的例項,因為預設的thread.run 就是直接呼叫內部的runnable介面,這樣避免了過載thread.run 因此使用runnable介面來告訴執行緒該做什麼更為合理。publ...

java併發程式設計 一

加鎖機制 用鎖來保護狀態 對於可能被多個執行緒同時訪問的可變狀態變數,包括每個包含多個變數的不變形條件 在訪問它的時候都需要持有同乙個鎖,稱為被這個鎖保護 if vector.containers element 活躍性與效能 死鎖和顯示鎖 1.死鎖 定義 當乙個執行緒永遠占有乙個鎖,而其他執行緒嘗...

Java併發程式設計基礎 ThreadLocal的使用

1.threadlocal 簡介 什麼是threadlocal threadlocal 為執行緒變數,是乙個以threadlocal物件為key,任意物件為值的儲存 結構,這個結構被附帶到執行緒上。threadlocal的作用 通過set t 來設定乙個值,在當前執行緒下通過get 方法獲取到原先設...