Java 多執行緒程式設計要點(synchronized)
多執行緒程式設計要點:
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步)。
double 和long 變數是非原子型的(non-atomic)。陣列是object 非原子型。
14. 由於13條的原因,我們解決辦法是:
class xxx extends Thread{
//i會被經常修改
private int i;
public synchronized int read(){ return i;}
public synchronized void update(){ i = i + 1;}
..........
}
15. Volatile變數, volatile變數表示保證它必須是與主記憶體保持一致,它實際是"變數的同步", 也就是說對於volatile變數的操作是原子型的,如用在long 或 double變數前。
16. 使用yield()會自動放棄CPU,有時比sleep更能提升效能。
17. sleep()和wait()的區別是:wait()方法被呼叫時會解除鎖定,但是我們能使用它的地方只是在一個同步的方法或程式碼塊內。
18. 通過製造縮小同步範圍,儘可能的實現程式碼塊同步,wait(毫秒數)可在指定的毫秒數可退出wait;對於wait()需要被notisfy()或notifyAll()踢醒。
19. 構造兩個執行緒之間實時通訊的方法分幾步:
(1). 建立一個PipedWriter和一個PipedReader和它們之間的管道;
PipedReader in = new PipedReader(new PipedWriter())
(2). 在需要傳送資訊的執行緒開始之前,將外部的PipedWriter導向給其內部的Writer例項out
(3). 在需要接受資訊的執行緒開始之前,將外部的PipedReader導向給其內部的Reader例項in
(4). 這樣放入out的所有東西度可從in中提取出來。
20. synchronized帶來的問題除效能有所下降外,最大的缺點是會帶來死鎖DeadLock,只有通過謹慎設計來防止死鎖,其他毫無辦法,這也是執行緒難以馴服的一個原因。不要再使用stop() suspend() resume()和destory()方法
21. 在大量執行緒被堵塞時,最高優先順序的執行緒先執行。但是不表示低階別執行緒不會執行,執行概率小而已。
22. 執行緒組的主要優點是:使用單個命令可完成對整個執行緒組的操作。很少需要用到執行緒組。
23. 從以下幾個方面提升多執行緒的效能:
檢查所有可能Block的地方,儘可能的多的使用sleep或yield()以及wait();
儘可能延長sleep(毫秒數)的時間;
執行的執行緒不用超過100個,不能太多;
不同平臺linux或windows以及不同JVM執行效能差別很大。
相關文章
- Java多執行緒程式設計要點Java執行緒程式設計
- Java多執行緒程式設計要點 (一)Java執行緒程式設計
- Java多執行緒程式設計筆記2:synchronized同步方法Java執行緒程式設計筆記synchronized
- Java 多執行緒併發程式設計之 Synchronized 關鍵字Java執行緒程式設計synchronized
- Java多執行緒(三):SynchronizedJava執行緒synchronized
- java多執行緒之(synchronized)Java執行緒synchronized
- java多執行緒3:synchronizedJava執行緒synchronized
- Java多執行緒之二(Synchronized)Java執行緒synchronized
- Java多執行緒之synchronized理論Java執行緒synchronized
- Java多執行緒——synchronized的使用示例Java執行緒synchronized
- Java多執行緒之synchronized詳解Java執行緒synchronized
- JAVA多執行緒-基礎篇-synchronizedJava執行緒synchronized
- Java多執行緒程式設計基礎Java執行緒程式設計
- Java多執行緒之執行緒同步【synchronized、Lock、volatitle】Java執行緒synchronized
- 程式設計思想之多執行緒與多程式(3):Java 中的多執行緒程式設計執行緒Java
- 多執行緒程式設計執行緒程式設計
- JAVA-多執行緒(關鍵字:synchronized)Java執行緒synchronized
- Java多執行緒5:synchronized鎖方法塊Java執行緒synchronized
- Java多執行緒4:synchronized鎖機制Java執行緒synchronized
- Java多執行緒程式設計—鎖優化Java執行緒程式設計優化
- Java-基礎程式設計-多執行緒Java程式設計執行緒
- java多執行緒程式設計--基礎篇Java執行緒程式設計
- Java多執行緒程式設計入門(轉)Java執行緒程式設計
- 使用Java實現多執行緒程式設計Java執行緒程式設計
- JavaScript多執行緒程式設計JavaScript執行緒程式設計
- Boost多執行緒程式設計執行緒程式設計
- UNIX多執行緒程式設計執行緒程式設計
- 多執行緒程式設計(轉)執行緒程式設計
- Java多執行緒之synchronized的小介紹Java執行緒synchronized
- java多執行緒程式設計chap5-7Java執行緒程式設計
- java多執行緒程式設計chap1-2Java執行緒程式設計
- java多執行緒程式設計chap3-4Java執行緒程式設計
- Java多執行緒程式設計之同步器Java執行緒程式設計
- Java多執行緒程式設計——進階篇一Java執行緒程式設計
- Java多執行緒程式設計——進階篇二Java執行緒程式設計
- 深入淺出Java多執行緒程式設計(轉)Java執行緒程式設計
- 淺析Java多執行緒程式設計機制Java執行緒程式設計
- Java併發程式設計—synchronized保證執行緒安全的原理分析Java程式設計synchronized執行緒