Java併發學習筆記(1) 併發程式設計基礎

2021-07-24 03:59:50 字數 1655 閱讀 7037

執行緒的狀態

new:初始狀態,執行緒被new 出來,但還沒start()的狀態

runnable:指的是呼叫了start()方法,但還在等著cpu資源的狀態;

running:乙個執行緒獲得了cpu資源,正在走的狀態;

terminated:執行緒物件的run()方法走完了的狀態

blocked:執行緒被阻塞,即該執行緒把cpu資源讓出來,等待其他操作再回來請求cpu的狀態、

2.執行緒通訊:

volatile:volatile修飾的變數每次訪問的時候都保證是記憶體中的最新版本,可以理解為「任何乙個執行緒修改了volatile變數,均能使其他執行緒感知到」。

synchronized:修飾**塊和方法,可以保證是執行緒同步的。即只能有乙個執行緒進入**塊。

wait/notify:

wait()只能在同步塊或方法裡面呼叫,呼叫wait方法後,該執行緒阻塞,直到其他執行緒呼叫這個物件的notify()方法,那麼該執行緒就回到佇列裡等待cpu資源。

此處有兩個注意的地方:(1)wait()方法需要對呼叫物件加鎖。(2)wait是釋放鎖的,但其他執行緒notify他了之後,這個wait的執行緒也不會繼續進行,必須等到notify他的執行緒離開同步塊,才能回到佇列裡等待cpu排程。(3)從wait方法返回的前提是獲得了呼叫物件的鎖。

用偽**描述生產者-消費者經典模型:

生產者:

synchronized(object o)
消費者:

synchronized(object o) 

dosth();

}

3.thread.join()

如果乙個執行緒a呼叫了b.join();,那麼a就阻塞,直到b執行緒的run()執行完,a再繼續執行。

寫了個小例子,將就看一下啦:

public

class

main catch (interruptedexception e)

system.out.println("main");

}}public

class

mythread

implements

runnable

@override

public

void

run() catch (interruptedexception e)

system.out.println(tid);

}}

那麼執行這段程式,會看到先輸出了

t1,t2要來啦!!

然後等了1秒之後,輸出了

1

2main

4.threadlocal

這東西是乙個封裝類,把乙個物件封裝成執行緒獨享的,底層維護的是乙個hashmap,其key是執行緒的hashcode,value是這個物件的副本。

get和set原始碼如下,其實和hashmap基本上如出一轍。

public t get() 

}return setinitialvalue();

}

public

void

set(t value)

Java高併發程式設計學習筆記1

執行緒的runnable狀態 已經具備執行條件,只等待cpu排程 萬事俱備只欠東風 1 thread類中得start方法啟動乙個執行緒,並且該執行緒進入了可執行態 runnabel 2 run方法和start方法的區別。3 線 正的執行邏輯在run方法中,通常我們把run方法稱為執行緒的執行單元。重...

JAVA併發1 併發程式設計的挑戰

乙個cpu同一時刻只能執行乙個執行緒 cpu 通過給每個執行緒分配一定的時間片,時間片非常短,通常是幾十毫秒,來不停的切換執行緒執行任務,達到了多執行緒的效果。當執行緒用完自己的時間片後,及時任務還沒有完成,作業系統也會剝奪它的執行權,讓另一條執行緒執行。當一條執行緒的時間片用完後,作業系統會暫停該...

java併發程式設計 並行和併發(1)

1.為什麼需要並行?效能 在多核cpu提高效能業務需求 平行計算還出於業務模型的需要 並不是為了提高系統效能,而是確實在業務上需要多個執行單元。比如http伺服器,為每乙個socket連線新建乙個處理執行緒 讓不同執行緒承擔不同的業務工作 簡化任務排程 2.概念 同步 synchronous 和非同...