1. 同一個程序中的多個線程能夠被同時調度到多個CPU上(利用這一點一般能提升cpu的使用率) java
2. 多線程運用的例子:RMI、Servlet、GUI(一般狀況下:GUI對象都只能在實事件線程中訪問且GUI的對象是被封閉在 單個線程當中)、Timer等 算法
3. 只有當類中僅包含本身的狀態時,線程安全類纔是有意義的 編程
4. 在必定條件下,能夠安全地放寬狀態變量的封裝性 緩存
5. 同步術語:sychronized、volatile類型的變量、顯式鎖、原子變量(concurrent包中) 安全
6. 最多見的競態條件:先檢查後執行(check-and-act),讀取--修改--寫入 多線程
7. 內置鎖:可重入(可重複獲取相同的鎖) 併發
8. 在構造方法中能夠建立線程,但最好不要啓動線程,以防止啓動的線程訪問未徹底構造的this引用 app
9. 構造方法中調用非private和final方法(即有可能被複寫的方法)時,也會致使this引用逸出 函數
10. 線程封閉的三種方式:Ad-hoc線程封閉、棧封閉、ThreadLocal類 高併發
11. final域(引用不指向可變對象的狀況下)是線程安全的
12. 安全發佈對象的經常使用模式:
①. 在靜態初始化函數中初始化一個對象引用
②. 將對象保存到某個正確構造對象的final類型域中
③. 將對象的引用保存到volatile類型的域或者AtomicReference對象中
④. 將對象的引用保存到一個由鎖保護的域中
13. 在併發編程中使用和共享對象時的策略:
①. 線程封閉
②. 只讀共享
③. 保護對象(持有特定的鎖)
④. 線程安全共享(線程安全的對象提供的公共訪問接口)
14. 在現有的安全類中添加功能:
①. 經過繼承擴展
②. 經過輔助類(客戶端加鎖機制)
③. 經過類的組合
15. 特定狀況能夠考慮併發容器替代同步容器
同步容器:將全部的對容器狀態的訪問都串行化,以實現線程安全(如:Vector)
併發容器:經過快照(如:CopyOnWriteArrayList)、分段鎖(如:ConcurrentHashMap)等方式實現線程安全
16. 利用BlockingQueue實現「生產者——消費者」模式;利用BlockingDeque實現「工做密取」模式
17. 中斷線程的通常處理方法:
第一種:run方法中無循環體
public void run(){ If(Thread.isInterrupted()){ return; } }
第二種:run方法中有循環體
public void run(){ for(;;;){ If(Thread.isInterrupted()){ break; } } }
第三種:拋出中斷異常結束程序
public void doEverIfNoException() throws InterruptedException{ If(Thread.isInterrupted()){ throw new InterruptedException(); } }
在執行currentThread.interrupt以後,也能夠經過調用Thread.sleep或者obj.wait或者currentThread.join使線程拋出中斷異常後結束,但JVM並不能保證阻塞方法檢測到中斷的速度(一般狀況下仍是很是快的)。
第四種:利用一個標誌位來控制程序
public void run(){ valotile isCancled = false; while(!isCancled){ doSomething(); } }
18. 一些經常使用的同步工具類:閉鎖(如:CountDownLatch, FutureTask),信號量(如:Semaphore),柵欄(如:CyclicBarrier, Exchanger)
19. 在使用Thread的地方,考慮若是使用Executor是否能得到更好的效果
20. 一般用ScheduledThreadPoolExecutor來替代Timer來執行延遲任務與週期任務
21. 遞歸算法的並行化處理(每一次遞歸都不存在依賴關係時)
22. 注意經過控制獲取「鎖」的順序的一致性來避免「死鎖」,也能夠嘗試使用「定時鎖」,同時要注意不要相信「線程的優先級」(由於它對平臺具備依賴性),最後不要忘記防止「活鎖」(在一個線程內重複執行某一操做,使線程沒法繼續向下執行)
23. 在試圖提升併發程序的性能時,要注意程序的「可擴展性」和「安全性」,並以測試爲基準,不要猜測
24. 線程引入的開銷:上下文切換、內存同步(如:經過刷新緩存是緩存無效)、阻塞(Spin-waiting方式,操做系統掛起被阻塞線程)
注:阻塞致使線程在其執行的時間片還未用完以前就被交換出去,而在隨後當要獲取的鎖或者其餘資源可用時,又被切換回來
25. 減小鎖的競爭3種方式:
①. 減小鎖的持有時間(如:縮小鎖的範圍)
②. 下降鎖的請求頻率(如:減少鎖的粒度,但採用此種方法應該考慮上下文切換頻率增高帶來的額外開銷)
③. 使用帶有協調機制的鎖(如:定時鎖)
26. 在激烈競爭狀況下,ReentrantLock非公平鎖性能高於其公平鎖,緣由:在恢復一個被掛起的線程與該線程正在開始運行之間存在着嚴重的延遲
27. ReentrantLock的特性包括:可定時、可輪詢、可中斷、公平隊列、非塊結構
28. ReentrantReadWriteLock支持多個線程同時讀取,但支持一個線程寫入,寫鎖能夠降級爲讀鎖,讀鎖不能升級爲寫鎖(讀鎖升級爲寫鎖可能致使死鎖)
29. 必要時能夠構造本身的同步工具(大多數的開發者這一輩子都不須要這麼作,緣由你懂得!)
30 顯示的Condition對象,不知你們用過沒有?能夠用來控制「多生產者---多消費者」模型
31. CAS------原子變量-------鎖,這些在不一樣場景下的性能能夠好好分析比較一下
32. 雙重檢查的罪惡:
public class DoubleCheckedLocking { private static Resource resource; public static Resource getInstance() { if (resource == null) { //此處可能致使獲到不完整的對象 synchronized (DoubleCheckedLocking.class) { if (resource == null) resource = new Resource(); } } return resource; } static class Resource { } }
雙重檢查的替代方案:延遲初始化佔位類模式
public class ResourceFactory { private static class ResourceHolder { public static Resource resource = new Resource(); } public static Resource getResource() { return ResourceFactory.ResourceHolder.resource; } static class Resource { } }
33. Java內存模型的Happens-Before規則(有精力的看看吧,但實際應用中一般仍是藉助同步來控制操做的順序)