原创 ReentrantReadWriteLock 類

ReentrantReadWriteLock 類, 顧名思義, 是一種讀寫鎖, 它是 ReadWriteLock 接口的直接實現, 該類在內部實現了具體獨佔鎖特點的寫鎖, 以及具有共享鎖特點的讀鎖, 和 ReentrantLock 一樣,

原创 Java ThreadPoolExecutor 線程池

Executors Executors 是一個Java中的工具類. 提供工廠方法來創建不同類型的線程池. 從上圖中也可以看出, Executors的創建線程池的方法, 創建出來的線程池都實現了 ExecutorService接口. 常用方

原创 ReentrantLock 類

在 Java 多線程中, 可以使用 synchronized 關鍵字來實現多線程之間同步互斥, 但在 JDK 1.5 中新增加了 ReentrantLock 類也能達到同樣的效果, 並且在擴展功能上也更加強大, 比如具有嗅探鎖定, 多路分支

原创 Java 多線程下篇 線程通訊

等待/通知機制 利用wait,notify實現的一個生產者、一個消費者和一個單位的緩存的簡單模型: public class QueueBuffer { int n; boolean valueSet = false;

原创 Java 多線程中篇

異步 public class PrintObject { public void printString(){ System.out.println("begin"); if(Thread.curr

原创 java 多線程基礎, 我覺得還是有必要看看的

Java 主線程名 我們啓動的一個程序可以理解爲一個進程, 一個進程中包含一個主線程, 線程可以理解爲一個子任務. Java 中可以通過下面代碼來獲取默認的主線程名. System.out.println(Thread.currentThr

原创 最渣的 Spring Boot 文章

spring-boot-starter-parent Maven的用戶可以通過繼承spring-boot-starter-parent項目來獲得一些合理的默認配置。這個parent提供了以下特性: 默認使用Java 8 使用UTF-8編碼

原创 @Bean 註解

@Configuration 以及其中的 @Bean 註解 @Configuration 註解: @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Document

原创 Java 平臺微服務架構的項目組成形式

微服務項目的依賴關係 在微服務化架構中, 軟件項目被拆分成多個自治的服務, 服務之間通過網絡協議進行調用, 通常使用透明的 RPC 遠程調用. 在 Java 領域, 每個服務上線後, 對外輸出的接口爲一個 jar 包. 在微服務領域, ja

原创 微服務架構的核心要點和實現原理

微服務去中心化治理 上圖中, 外部服務和內部服務屬於 API 網關, 所有的服務由統一的 API 網關進行管理. 比如外部應用要調用服務1, 就會經過 API 網關(外部服務), 內部應用也是一樣的. 如果服務N要調用服務2, 則也需要通

原创 分佈式服務架構

什麼是分佈式系統 從進程角度看, 兩個程序分別運行在兩臺主機的進程上, 它們相互協作最終完成同一個服務, 那麼理論上這兩個程序所組成的系統, 可以稱作"分佈式系統". 當然, 這兩個程序可以是不同的程序, 可以是相同的程序. 如果是相同的程

原创 持續集成 Jenkins 簡介

持續集成的定義 大師 Martin Fowler 是這樣定義持續集成的: 持續集成是一種軟件開發實戰, 即團隊開發成員經常集成他們的工作. 通常, 每個成員每天至少集成一次, 也就意味着每天可能發生多次集成. 持續集成並不能消除Bug, 而

原创 我是怎樣閱讀 Netty Channel 源碼的

Channel 功能說明 我在使用 ServerBootstrap 來創建服務的時候通過 channel(NioServerSocketChannel.class) 來設置 Channel, 那麼 Channel 的主要作用是什麼呢? 在分

原创 Netty WebSocket 協議

HTTP 協議的弊端 HTTP 協議爲半雙工協議. 半雙工協議指數據可以在客戶端和服務端兩個方向上傳輸, 但是不能同時傳輸. 它意味這同一時刻, 只有一個方向上的數據傳輸; 客戶端發送請求, 服務器等待, 直到收到完整的請求. 然後發送迴

原创 netty 中使用 Protobuf

private class ChildChannelHandler extends ChannelInitializer<SocketChannel> { @Override protected void i