多執行緒與高併發 一

2021-10-07 11:24:57 字數 2438 閱讀 2348

建立乙個執行緒的兩種方式:

繼承thread

class

mythread

extends

thread

newmythread()

.start()

;

實現runnable介面
class

mythread

implements

runnable

newthread

(new

myrun()

).start()

;

面試時候有時候會問到,啟動執行緒的三種方式

thread、

runnable

通過lambda表示式或者executors.newcachedthread(執行緒池) 第三種說白了也是用的第一和第二的兩種的其中一種

暫停執行緒的幾種方式

sleep,當前執行緒暫停一段時間,讓給別的執行緒

yield,非常謙讓的退出一下,讓出一下cpu,先從cpu上執行先離開,進入到乙個等待佇列中,至於cpu從佇列中拿出哪個,這個就是隨機的了

join,把其他執行緒加入到我執行的執行緒中,相當於兩個執行緒t1,t2,當在t1中呼叫了t2.join的時候,t2執行完畢,t1才能繼續執行,這塊有個面試題:怎麼能夠保證三個執行緒按照順序執行? 使用join方法就可以保證按照想要的順序執行。

工作中,我們在多執行緒中,不建議使用stop()方法,該方法已經被廢止,中斷執行緒我們使用interrupt方法,打斷,但是中止完方法,必須catch出exception,做相應的操作。一般很少用這幾個方法。

獲取乙個執行緒的狀態:使用getstate()方法

synchronized 關鍵字

是一種同步鎖。它修飾的物件有以下幾種:

修飾乙個**塊,被修飾的**塊稱為同步語句塊,其作用的範圍是大括號{}括起來的**,作用的物件是呼叫這個**塊的物件;

修飾乙個方法,被修飾的方法稱為同步方法,其作用的範圍是整個方法,作用的物件是呼叫這個方法的物件;

修改乙個靜態的方法,其作用的範圍是整個靜態方法,作用的物件是這個類的所有物件;

修改乙個類,其作用的範圍是synchronized後面括號括起來的部分,作用主的物件是這個類的所有物件。

synchronized 關鍵字加了以後,不加鎖的效率是加鎖的100倍,所以能不加鎖盡量不要加鎖

public

classt}

}

鎖定當前物件

public

classt}

}//或者這樣寫,這兩種方法是等值的

public

class

t}

當乙個方法是靜態方法的時候,static修飾的時候,synchronized修飾的話,修飾該方法,相當於給該類加鎖即syn(t.class)

public

class

tpublic

static

voidn(

)}}

synchronized是可重入鎖,乙個同步方法可以呼叫另外乙個同步方法,乙個執行緒已經擁有某個物件的鎖,再次申請的時候仍然會得到該物件的鎖

public

class

tcatch

(interruptedexception e)m2(

);system.out.

println

("m1 end");

}synchronized

voidm2(

)catch

(interruptedexception e)

system.out.

println

("m2");

}public

static

void

main

(string[

] args)

}

synchronized的底層實現

jdk早期的時候,實現是重量級 --》 os作業系統申請鎖

後來改進:

鎖公升級概念:可以查下 我就是廁所所長(一,二)

鎖公升級文章一

鎖公升級文章二

當我們使用sync(object) 上來後,先在object頭上面,markword記錄這個執行緒id,並沒有加鎖,這個叫偏向鎖,如果有執行緒爭用的話,偏向鎖會公升級為自旋鎖,就是相當於另外乙個執行緒一直在while(true)等待該執行緒結束,不會加入到cpu佇列中去,自旋鎖預設情況下旋轉10次,若10次後,則公升級為重量級鎖—》os作業系統鎖(原子類)

那麼有個問題:什麼時候用自旋鎖,什麼時候用重量級鎖?

執行時間比較短(加鎖**),執行緒數少,用自旋鎖,

執行時間比較長,執行緒數多,用系統鎖

多執行緒與高併發(一)

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

多執行緒與高併發

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

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

一 thread.sleep 當前執行緒睡眠指定時間後回到就緒狀態 回到等待佇列 thread.yield 當前執行緒直接回到就緒狀態 回到等到佇列 thread.join 讓其他執行緒在此行執行後優先執行,等他執行完了,當前才開始執行 this.getstate 當前執行緒的狀態 六大狀態,run...