JAVA高併發六 併發設計模式

2021-08-23 14:27:04 字數 3270 閱讀 6790

單例模式

單例是最常見的一種設計模式, 一般用於全域性物件管理, 比如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執行緒開始執行的場合 自己理...