構建Java 中間件基礎知識

中間件java

  • 軟件膠水
  • 不是操做系統、不是數據庫管理系統、不是軟件應用一部分,
  • 而是讓軟件開發者方便處理通訊、輸入和輸出、專一業務應用部分
  • 橋樑做用

三個領域的中間件數據庫

  • 遠程過程調用和對象訪問中間件
    • 分佈式環境下應用的互相訪問
    • 應用服務化的基礎
  • 消息中間件
    • 解決應用之間消息傳遞、解耦、異步的的問題
  • 數據訪問中間件
    • 解決訪問數據庫的共性問題的組件

  • 使用線程池、使用有固定上限的線程池
    • 線程建立消耗很大
  • synchronized
    • 使用修飾代碼塊的方式比較靈活,直接修飾方法不靈活
    • 互斥效果
    • 同步本地線程變量值和主存一致
  • ReentrantLock(重入鎖)
    • 用法相似synchronized,不過須要顯式 unlock
    • 引入緣由:
      • 提供了tryLock 方法
        • 返回false表明鎖被其餘線程持有,不能獲取;
        • true表明沒被其餘線程持有,獲取成功。
      • 構建ReentrantLock 時,有一個構造函數參數是Boolean 類型
        • 描述鎖公平與否,
        • 公平鎖嚴格排隊(效率低一些);
        • 非公平鎖搶佔式(效率高點)
  • ReentrantLock 提供了ReentrantReadWriteLock 
    • 主要用於讀多寫少,而且讀不須要互斥的場景
    • 這樣使用讀寫鎖會比所有互斥的鎖性能高不少
  • volatile
    • 保證了所修飾變量的可見性
    • 輕量級實現變量可見性的方法
    • 更多修飾開關狀態的變量(取值不會使用本地線程副本)
  • 以下圖(在讀的層面)
    • i3  synchronized 關鍵詞,保證了本地線程副本與主存同步,也是最新的
    • i2 取值不會使用本地線程副本,是最新的
    • i1 可能不是最新的

  • 以下圖,在寫的層面
    • i1 設置後會當即獲得最新值,其餘線程不必定
    • i2 volatile 保證變量僅僅在主存保存一份,其餘線程當即能看到最新值
    • i3  synchronized 關鍵字,會把本地副本同步到主存,可是別的線程查看不必定和主存一致(除非也加上synchronized ,先同步本地副本和組從在讀取)

  • volatile 僅僅保證可見性,put 不是線程安全的
    • 因此多線程下面代碼最後的 count 可能會大於100
    • 加上synchronized  輕鬆搞定

  • Atomics包
    • 提供一些原子操做 
    • 與本身手動同步相比,使用簡單線程安全,性能高不少
    • 性能高不少的緣由是使用了硬件支持的指令

  • wait、notify、notifyAll 使用時必須放在synchronized 塊裏面
    • 實際應用中,wait外面套循環,防止虛假喚醒

  • CountDownLatch
    • 等全部都執行完countDown後,wait纔會被喚醒
    • countDown執行完countDown ,該線程不會阻塞,而是繼續本身的工做

  • CyclicBarrier(字面意思:循環屏障、柵欄)
    • 等全部線程都到達await,一塊兒開始執行
    • 也就是說提早到達await的線程會阻塞在這裏
      • 所以使用時請當心,線程池小的話,很容易死鎖
    • 每一個線程都帶一個await,循環外也帶一個await,因此是count+1個
  • CountDownLatch 不能循環使用 CyclicBarrier 能夠

  • Semaphore用於管理信號量,構造時傳入可供管理信號量數量
    • 若是管理的信號量數量爲1,Semaphore退化爲互斥鎖
      • 大於1 的時候,主要用於控制最大併發數,超過最大併發量就阻塞等待併發量降下來在執行
    • 執行前acquire方法 獲取信號量(獲取不到就會阻塞),release 釋放
    • acquire 和release 能夠帶參數,參數的含義就是獲取、返還信號量個數

  • ExChanger 用於兩個線程之間進行數據交換
    • 線程會阻塞在ExChanger 的exchange 方法,直到另外一個線程也執行到同一個ExChanger 的exchange 方法
    • 兩者進行交換,而後繼續執行本身的方法

  • Future(接口) 和 FutureTask(具體實現類)

併發容器安全

動態代理多線程

反射併發

  • 反射本質是生成動態代理來執行該方法
  • newInstance 建立對象時,必定要有無參構造函數,不然會拋異常
  • 字節碼加強
    • Javassist
    • cglib
    • asm
      • ASM是一個java字節碼操縱框架,它能被用來動態生成類或者加強既有類的功能。
      • ASM 能夠直接產生二進制 class 文件,也能夠在類被加載入 Java 虛擬機以前動態改變類行爲。
      • Java class 被存儲在嚴格格式定義的 .class文件裏,這些類文件擁有足夠的元數據來解析類中的全部元素:類名稱、方法、屬性以及 Java 字節碼(指令)。
      • ASM從類文件中讀入信息後,可以改變類行爲,分析類信息,甚至可以根據用戶要求生成新類。
    • bcel

相關文章
相關標籤/搜索