多執行緒與高併發 1 synchronized 篇

2021-10-12 15:16:49 字數 2211 閱讀 3013

程序 執行緒 協程/纖程(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 面試時候有時候會...