執行緒的狀態:
執行緒建立的第二種方式:
將任務封裝成物件:
方法二的好處(區別):
___繼承 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同步化時,其它執行緒可能看不到這種變化。這不是可不可以分割的問題,而是其它執行緒是否可見的...