單例模式
單例是最常見的一種設計模式, 一般用於全域性物件管理, 比如xml配置讀寫之類的.
一般分為懶漢式, 餓漢式.
懶漢式: 方法上加synchronized
這種方式, 由於每次獲取示例都要獲取鎖, 不推薦使用, 效能較差
懶漢式: 使用雙檢鎖 + volatile
本方式是對直接在方法上加鎖的乙個優化, 好處在於只有第一次初始化獲取了鎖.
後續呼叫getinstance已經是無鎖狀態. 只是寫法上稍微繁瑣點.
懶漢式: 使用靜態內部類
該方式既解決了同步問題, 也解決了寫法繁瑣問題. 推薦使用改寫法.
缺點在於無法響應事件來重新初始化instance.
餓漢式
缺點在於物件在一開始就直接初始化了.
future模式
該模式的核心思想是非同步呼叫. 有點類似於非同步的ajax請求.
當呼叫某個方法時, 可能該方法耗時較久, 而在主函式中也不急於立刻獲取結果.
因此可以讓呼叫者立刻返回乙個憑證, 該方法放到另外執行緒執行,
後續主函式拿憑證再去獲取方法的執行結果即可, 其結構圖如下
jdk中內建了future模式的支援, 其介面如下:
通過futuretask實現
注意其中兩個耗時操作.
如果dootherthing耗時2s, 則整個函式耗時2s左右.
如果dootherthing耗時0.2s, 則整個函式耗時取決於realdata.costtime, 即1s左右結束.
public class futuredemo1
});executorservice service = executors.newcachedthreadpool();
service.submit(future);
system.out.println("realdata方法呼叫完畢");
// 模擬主函式中其他耗時操作
dootherthing();
// 獲取realdata方法的結果
system.out.println(future.get());
}private static void dootherthing() throws interruptedexception
}class realdata catch (interruptedexception e)
return "exception";}}
通過future實現
與上述futuretask不同的是, realdata需要實現callable介面.
public class futuredemo2
private static void dootherthing() throws interruptedexception
}class realdata2 implements callable catch (interruptedexception e)
return "exception";
}@override
public string call() throws exception
}另外future本身還提供了一些額外的簡單控制功能, 其api如下
// 取消任務
boolean cancel(boolean mayinterruptifrunning);
// 是否已經取消
boolean iscancelled();
// 是否已經完成
boolean isdone();
// 取得返回物件
v get() throws interruptedexception, executionexception;
// 取得返回物件, 並可以設定超時時間
v get(long timeout, timeunit unit)
throws interruptedexception, executionexception, timeoutexception;
生產者消費者模式
生產者-消費者模式是乙個經典的多執行緒設計模式. 它為多執行緒間的協作提供了良好的解決方案。
在生產者-消費者模式中,通常由兩類執行緒,即若干個生產者執行緒和若干個消費者執行緒。
生產者執行緒負責提交使用者請求,消費者執行緒則負責具體處理生產者提交的任務。
生產者和消費者之間則通過共享記憶體緩衝區進行通訊, 其結構圖如下
pcdata為我們需要處理的元資料模型, 生產者構建pcdata, 並放入緩衝佇列.
消費者從緩衝佇列中獲取資料, 並執行計算.
生產者核心**
1 while(isrunning)消費者核心**10 }
1 while (true)生產消費者模式可以有效對資料解耦, 優化系統結構.10 }
降低生產者和消費者執行緒相互之間的依賴與效能要求.
一般使用blockingqueue作為資料緩衝佇列, 他是通過鎖和阻塞來實現資料之間的同步,
如果對緩衝佇列有效能要求, 則可以使用基於cas無鎖設計的concurrentlinkedqueue.
java 併發 高併發概述
為什麼需要並行 有關並行的重要概念 有關並行效能的2個重要定律 多執行緒基礎 執行緒的基本操作 守護執行緒 優先順序 中斷處理 基本的執行緒同步操作 各種同步控制工具的使用 併發容器及典型原始碼分析 同步工具 併發容器使用小案例 第5課 jdk並發包 執行緒池的基本使用 擴充套件和增強執行緒池 執行...
高併發系統設計
高併發系統主要是為了解決在有限的資源下解決最核心的問題,並發現以後可能會出現的問題。高併發原則一般遵守如下幾個設計原則 1.無狀態 指的是應用在處理業務邏輯期間盡量減少鎖的使用 降低網路通訊延遲 無資料持久化操作等,以此來增加應用系統的效能。2.拆分 大而全的系統,可根據實際的訪問量來拆分系統,來實...
java併發程式設計 六
併發工具類 lk最近學習了併發工具類的知識,總結一下它們的用法 1.countdownlatch 2.cyclicbarrier 3.semaphore 4.exchanger 使用完countdownlatch之後,覺得它適合應用於讓其它執行緒去各自執行完,然後main執行緒開始執行的場合 自己理...