多線程設計要點-JSP教程,物件導向/設計
來源:互聯網
上載者:User
1.多線程中有主記憶體和工作記憶體之分, 在JVM中,有一個主記憶體,專門負責所有線程共用資料;而每個線程都有他自己私人的工作記憶體, 主記憶體和工作記憶體分貝在JVM的stack區和heap區。
2.線程的狀態有'Ready', 'Running', 'Sleeping', 'Blocked', 和 'Waiting'幾個狀態,
'Ready' 表示線程正在等待CPU分配允許啟動並執行時間。
3.線程運行次序並不是按照我們建立他們時的順序來啟動並執行,CPU處理線程的順序是不確定的,如果需要確定,那麼必須手工介入,使用setPriority()方法設定優先權。
4.我們無從知道一個線程什麼時候運行,兩個或多個線程在訪問同一個資源時,需要synchronized
5. 每個線程會註冊自己,實際某處存在著對它的引用,因此,記憶體回收機制對它就“束手無策”了。
6. Daemon線程區別一般線程之處是:主程式一旦結束,Daemon線程就會結束。
7. 一個對象中的所有synchronized方法都共用一把鎖,這把鎖能夠防止多個方法對通用記憶體同時進行的寫操作。synchronized static方法可在一個類範圍內被相互間鎖定起來。
8. 對於訪問某個關鍵共用資源的所有方法,都必須把它們設為synchronized,否則就不能正常工作。
9. 假設已知一個方法不會造成衝突,最明智的方法是不要使用synchronized,能提高些效能。
10. 如果一個"同步"方法修改了一個變數,而我們的方法要用到這個變數(可能是唯讀),最好將自己的這個方法也設為 synchronized。
11. synchronized不能繼承, 父類的方法是synchronized,那麼其子類重載方法中就不會繼承“同步”。
12. 線程堵塞Blocked有幾個原因造成:
(1)線程在等候一些IO操作
(2)線程試圖調用另外一個對象的“同步”方法,但那個對象處於鎖定狀態,暫時無法使用。
13.原子型操作(atomic), 對原始型變數(primitive)的操作是原子型的atomic. 意味著這些操作是安全執行緒的, 但是大部分情況下,我們並不能正確使用,來看看 i = i + 1 , i是int型,屬於原始型變數:
(1)從主記憶體中讀取i值到本地記憶體.
(2)將值從本地記憶體裝載到線程工作拷貝中.
(3)裝載變數1.
(4)將i 加 1.
(5)將結果給變數i.
(6)將i儲存到執行緒區域工作拷貝中.
(7)寫回主記憶體.
注意原子型操作只限於第1步到第2步的讀取以及第6到第7步的寫, i的值還是可能被同時執行i=i+1的多線程中斷打擾(在第4步)。