建立乙個執行緒的兩種方式:
繼承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...