多執行緒與高併發程式設計(一)

2021-10-04 01:25:32 字數 1731 閱讀 1824

一、

thread.sleep() 當前執行緒睡眠指定時間後回到就緒狀態(回到等待佇列)

thread.yield() 當前執行緒直接回到就緒狀態(回到等到佇列)

thread.join() 讓其他執行緒在此行執行後優先執行,等他執行完了,當前才開始執行

this.getstate() 當前執行緒的狀態(六大狀態,runnable自己算一種,下圖裡面最大的塊是runnable狀態)禁止stop()方法

interrupt()在wait,sleep等方法時打斷並丟擲乙個異常,catch這個異常進行處理(比如說睡了2天,你需要打斷他)

注(重點):wait()方法會釋放當前的同步鎖,其他執行緒可以搶了,notify()喚醒執行緒之後需要重新搶鎖才能執行鎖內部分!!

二、執行緒三種實現方式

三、synchronized

可見性(多執行緒之間修改互相可見)

原子性(當前**塊內有執行緒在執行,其他執行緒不可進入,鎖定的是物件(this / xx.class,普通方法鎖this,static方法鎖xx.class)而不是**,在new object()時,是64位的,頭裡面有2位markword代表各種的鎖,執行緒來了是得到這個物件而不是鎖**)

synchronized(this)

synchronized void function()

相同;可重入(synchronized方法中呼叫另乙個synchronized方法是可以的,因為是同乙個執行緒呼叫m2時發現是自己拿到了這把鎖,ok可以進入)

鎖定的方法和非鎖定方法可以同時執行(new thread)。

synchronized(object),這裡的object不能用string常量(因為常量都是大家指向同乙個區域的,鎖定了這個可能別的地方受影響) integer(因為integer物件封裝時內部進行了處理,值發生改變就會產生乙個新的物件) long等等基礎的資料型別…

程式之中遇見了異常,預設情況下會釋放鎖,catch了異常不丟擲然後讓程式繼續執行下去即可避免。

下圖中加了synchronized之後就沒必要在count前加volatile了,因為synchronized既保證了原子性,***了可見性

四、synchronized的底層實現

鎖公升級sync(object)

偏向鎖:當new object時,markword記錄這個執行緒id(使用偏向鎖),如果還是這個執行緒執行,那麼直接放行。

自旋鎖:如果偏向鎖有執行緒爭用,公升級為自旋鎖,自旋鎖是消耗cpu資源的。

重量級鎖(os級別,核心態):自旋鎖預設是自旋10次後,如果還得不到這把鎖,公升級為重量級鎖,重量級鎖在乙個執行緒得到後,其他的執行緒回到等待佇列,是不占用cpu資源的。

結論:執行時間段(枷鎖**),執行緒數少,用自旋鎖。

執行時間長,執行緒數多,用重量級鎖。

鎖一般來講是不能降級的。

北京馬士兵教育學習筆記整理

多執行緒與高併發 一

建立乙個執行緒的兩種方式 繼承threadclass mythread extends thread newmythread start 實現runnable介面class mythread implements runnable newthread new myrun start 面試時候有時候會...

多執行緒與高併發(一)

官方概念 幾乎所有的作業系統都支援同時執行多個任務,乙個任務通常是乙個程式,每個執行中的程式就是乙個程序。當乙個程式執行時,內部可能包含了多個順序執行流,每個順序執行流就是乙個執行緒。而執行緒呢,乙個程序裡最小的執行單元就叫乙個執行緒。簡單理解就是乙個程式不同的執行路徑。示例 public clas...

多執行緒與高併發

blocked 鎖池 timed waiting 定時等待 waiting 等待 terminated 禁止指令重排序 記憶體屏障 在單例雙重檢查中,不加會出現使用半初始化的值,也就是還未附初始值,指令重排導致的 類載入與指令重排的知識 public class spinlock while fla...