程序 執行緒 協程/纖程(quasur)
乙個程式裡不同的執行路徑
public
static
class
t1extends
thread
}// 方法一
newmythread()
.start()
;// 方法二
newmythread()
.start()
;// 方法三
newthread((
)->
)
建立執行緒的兩種方式:
建立乙個類,繼承thread,重寫方法
定義乙個類,實現 runnable 介面,然後重寫 run 方法
啟動: 方法一:new mythread().start();
方法二:new thread(new myrun()).start();
方法三:new thread(()->)
//啟動執行緒的三種方式:1、從
thread
繼承2、實現
runnable
介面3、從執行緒池中啟動
executors.newcachedthrad
執行緒的基本方法
// sleep 睡眠
thread.
sleep
(500);
// 毫秒
// yield 讓出一下cpu 進入等待佇列(如果沒有等待的則繼續執行)
// 使用場景,較少
thread.
yield()
;// join
thread t1 =
newthread((
)->
)thread t2 =
newthread((
)->
)
在t1中呼叫 t2.join();則執行到 join 之後,t1進入等待模式,先執行完t2之後,再返回執行t1。
常用來等待執行緒結束。
補充:.stop()方法,用於結束執行緒的,但是太粗暴了,不建議使用。
;
.intereptor( )
喚起;
.getstate()
獲取執行緒狀態。
執行緒的鎖
上鎖
private
int count =10;
private object o =
newobject()
;public
voidm(
)}// synchronized(this) 等值於 synchronized(方法);
public
class
tpublic
static
voidmm(
)}}
synchronized()
能不加鎖就不加鎖,加鎖之後效率極低。
synchronized的特性
可重入性
乙個方法m1
加鎖,另乙個方法m2
也加了鎖(同一把鎖),那麼m1
是可以呼叫m2
的。
異常的鎖
程式中的鎖的內容出現了異常,那麼該鎖將被釋放。
synchronized 底層實現
早期 需要去找作業系統申請
後期:synchronized(object)
markdown 記錄這個執行緒的 id 偏向鎖 只記錄id,不鎖(預設沒有第二個執行緒來訪問)
如果有執行緒爭用:公升級為 自旋鎖 迴圈10次(占用cpu)
10次之後,公升級為重量級鎖 去作業系統申請鎖(不占用 cpu)
自旋鎖:在使用者態解決問題,不經過核心態。
執行時間長的用系統鎖,(加鎖**)執行時間特別短,執行緒較少,用自旋鎖。
多執行緒與高併發
blocked 鎖池 timed waiting 定時等待 waiting 等待 terminated 禁止指令重排序 記憶體屏障 在單例雙重檢查中,不加會出現使用半初始化的值,也就是還未附初始值,指令重排導致的 類載入與指令重排的知識 public class spinlock while fla...
多執行緒與高併發1 基礎定義
程序是作業系統能夠分配的最小單位 執行緒是作業系統能夠排程的最小單位 乙個程式的不同執行路徑 1.thread 2.runnable 3.executors sleep執行緒進行睡眠,讓出cpu給其他執行緒繼續執行。到規定的時間喚醒 yield將當前執行緒回到等待佇列中,返回到就緒狀態,讓出cpu ...
多執行緒與高併發 一
建立乙個執行緒的兩種方式 繼承threadclass mythread extends thread newmythread start 實現runnable介面class mythread implements runnable newthread new myrun start 面試時候有時候會...