Java 回顧筆記 多執行緒 2

2021-07-10 08:12:18 字數 2307 閱讀 9381

執行緒的狀態:

執行緒建立的第二種方式:

將任務封裝成物件:

方法二的好處(區別):

___繼承 thread和實現 runtimethread 小區別

如果當你想實現4個執行緒同時對乙個元素進行操作,就用run

如果你想4個執行緒 四個元素就用thread

因為當你使用繼承thread的 時候,你就建立了4個物件 開闢了四個空間;

而你去實現run方法的時候,只用建立乙個物件,和4個執行緒物件。他們公用乙個物件的資料;

——)————

多執行緒的安全隱患:

只能catch不能throws的情況;

當你實現的介面沒有宣告異常,所以你實現了介面,也不能宣告異常。只能catch;

安全問題:因為當你4個執行緒同時執行的時候,可能在最後判斷的時候會出現,四個執行緒都已經進來,比如 if(num>0) 當num=1的時候,四個執行緒都已經完成了判斷,準備進行其他處理,但是當第乙個執行緒執行完時,num=0;到第二個執行緒繼續執行的時候,num=-1。。所有會有安全隱患; __

安全問題發生的原因:

解決方法:同步**塊

注意我們傳遞了乙個object的物件進來.

_____

同步的好處和壞處:

同步的前提:

如果只有乙個執行緒,那麼就不需要同步;

___當你執行緒的run();內部呼叫其他的方法的時候,被呼叫的方法也變成了執行緒的**,

所以 如果在被呼叫的方法中又安全隱患也需要解決。

————————

解決方法2:同步函式

——————

同步函式的鎖:

同步函式用的鎖死this;同步**塊用的是obj(就是傳進同步**的物件); __

同步函式和同步**塊的區別:

同步函式可以看成同步**塊的簡寫,當你使用的是this作為物件的時候,

就可以使用同步函式。

————————

靜態函式的同步函式鎖:

當你的函式是靜態函式的時候,我們同步函式 使用的class的位元組碼物件.

this.getclass()獲取當前class的位元組碼物件。

應為當我們進記憶體的時候我們是先找到位元組碼物件。所以我們靜態函式會去使用

這個位元組碼物件。

乙個class只有乙個位元組碼物件,而獲取位元組碼物件有兩種方式

——————————

單例設計同步問題:

當我們使用懶漢式的時候,如果使用多執行緒會出現 安全問題。所以我們給他加上

同步,但是當我們使用同步函式來解決安全問題的時候,就會發現,當你s不等於

空的時候,他每一次執行還是要判斷 鎖。這樣降低了我們開發效率。

所以我們使用同步**塊,但是這樣還沒解決,效率問題,所以我們在 鎖前面在

加乙個判斷,這樣就解決了判斷問題。

但是我們可以發現 懶漢式還是相對麻煩。一般我們還是使用餓漢式。

————————

死鎖:死鎖容易發生的情況:同步的巢狀。

死鎖例子:

————————

注意事項:

我們要實現同步必須是每乙個執行緒使用的都是同乙個鎖;

java多執行緒總結筆記2 執行緒池

四種執行緒池 singlethreadexecutor 池中只有乙個工作者執行緒,按照任務的提交順序序列地執行所有任務。如果執行緒因為異常結束,則會有乙個新執行緒來替代它。cachedthreadpool 新任務提交時,如果所有執行緒都在忙,就新建乙個執行緒,池中線程的數量沒有上限。乙個執行緒如果長...

java多執行緒(2)

1.synchronized 鎖重入 執行緒請求由自己持有的物件時,如果該鎖是重入鎖,請求就會成功,否則阻塞 2.synchronized出現異常時,鎖自動釋放 3.當多個執行緒要同乙個例項時 雙重校驗鎖 public class dubblesingleton catch interruptede...

Java多執行緒筆記

synchronized修飾符是不會被子類繼承的。也就是說,乙個執行緒安全的可繼承類,有可在子類化時喪失安全性 p60 當執行緒在寫指定欄位的值時,若這個字段不是volatile也沒有用synchronized同步化時,其它執行緒可能看不到這種變化。這不是可不可以分割的問題,而是其它執行緒是否可見的...