構建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 塊裏面
- 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
歡迎關注本站公眾號,獲取更多信息