java多線程一些相關概念

同步和異步:同步方法調用開始後,需等到本次調用有結果才繼續往後執行;異步調用發生後,調用者無需等待返回,繼續後續執行。舉個例子你出去打籃球先到樓下小賣部買瓶水,老闆店裏現在沒貨,要去別的地方取,這個時候你要是等老闆取到水給你你再去打籃球那這就是同步調用,而要是你跟老闆約定水到了以後給你送到籃球場,你自己先去打球,那這個過程就是異步調用。

併發和並行:併發偏重於多個任務交替執行,由系統分配時間片,由於切換頻繁看起來像是同時執行,而實際上同一時刻只有一個任務在執行。並行則是真正意義上的同時執行。

臨界區:或者說是共享資源,但是同一時刻只能被一個線程佔用,最經典的例子就是打印機了(一個公司只有一臺的那種)。

阻塞和非阻塞:通俗點說就是兩個線程是否互相影響,佔用相同的資源。還是上邊的打印機,同事A在打印文件,這是同事B要是也要打印東西的話就只能等待,對於線程而言,等待會導致掛起,這種情況就是阻塞了(這個時候要是領導也要打印文件的話,可能會導致A、B都等待了,因爲領導優先級比較高);非阻塞強調的是線程間互相沒有影響。

死鎖、飢餓、活鎖:死鎖是比較糟糕的情況,以AB兩人吃飯爲例,兩人相對而坐,桌上只有兩根筷子,兩人按照習慣都先伸出右手去拿右邊的筷子,然後再去拿左邊的筷子,如果兩人都不放棄自己手上的筷子那麼這個狀態就將一直持續,也就是發生了死鎖;飢餓就是同事A想用打印機的時候發現前邊領導再用,於是A站在後邊等待,但是比較悲劇的是後續又有幾個領導過來要打印文件,於是同事A就一直等,這種情況就稱爲飢餓,由於領導優先級比較高或者臉皮比較厚一直佔着資源不放,就會導致同事A一直無法正常工作。飢餓在一段時間以後是有可能解決的。活鎖就是肥皂劇裏一個比較常見的鏡頭——男女主角小路上相對偶遇,互相謙讓,讓對方先過,結果是一而再、再而三的撞在一起,這種情況發生在兩個線程間就是不斷地主動釋放資源給其他線程使用,導致沒有線程可以同時拿到所有資源正常執行。

無鎖CAS(Compare and Swarp):所有線程都可以訪問臨界區,保證必然有一個線程能在有限的次數內完成操作,離開臨界區。juc的包中有很多涉及CAS的類,原理大致是在操作數據時傳入原值及預期值,若是處理結果與預期值不符則重試,以此保證在當前線程的操作沒有受到其他線程影響。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章