可伸縮性:指的是一個應用程序在工作負載和可用處理資源增加時其吞吐量的表現情況。一個可伸縮的程序能夠通過使用更多的處理器、內存或者I/O帶寬來相應地處理更大的工作負載
進程:資源利用,公平,方便這些因素操作系統支持多進程同時執行,進程是操作系統分配資源的單位,比如內存,文件句柄,安全證書,進程間通信有Socket,信號處理,共享內存,信號量,消息傳遞和文件。
線程:相同的因素也促進了進程多分支執行,這些分支就是線程,線程共享所屬進程的資源,比如內存,文件句柄,每一個線程都有自己的程序計數器,堆棧,線程是操作系統的時序調度單元。
線程優點:使用多處理器,模型的簡化,異步事件的簡單處理,用戶界面響應更佳。
線程風險:安全風險(競爭條件),活躍度危險(死鎖,飢餓,活鎖),性能危險(上下文切換,同步,鎖定,內存刷新,限制編譯器優化)。
線程安全:當多個線程訪問一個類時,如果不用考慮這些線程在運行時環境下的調度和交替執行,並且不需要額外的同步及在調用方代碼不必做其他的協調,這個類的行爲仍然是正確的,那麼稱這個類是線程安全的。
鎖:鎖方法和鎖代碼塊,可重入(每個鎖會關聯請求技術和佔有者),保證可見和互斥
volatile變量:保證可見,不保證原子(使用原則是沒有狀態依賴,依賴自己和依賴別人)
Java的線程API抽象:實現Runnable接口,然後把這個類的實例傳入Thread的構造函數,調用Thread.start().
Runnable只是一個不能返回結果和拋異常的任務抽象,Java5併發包所以提供了Callable和Future。
無限制創建線程缺點:管理線程生命週期的開銷,資源消耗量,穩定性。
Executor框架:將並行任務抽象爲Runnable,然後提交給執行器接口,執行器可以替換,不同執行器不同的執行策略,ExecutorService擴展Executor接口,提供生命週期方法。
newCachedThreadPool
:根據需要創建線程的線程池
newFixedThreadPool
:固定線程數的線程池
newScheduledThreadPool
:定期執行的線程池
newSingleThreadExecutor
:單線程執行器
這本書讀到最後,發現,我靠,原來併發編程是可以無鎖的。