原创 SpringApplication.run到底發生了什麼?

以下代碼爲SpringBoot應用的啓動類的代碼,相信每個人都見過太多次這個啓動類了,main方法中只有一行代碼,這行代碼到底發生了什麼? public class ApiApplication { public stat

原创 AQS的doAcquire和doRelease

上篇博客講了tryAcquire和tryRelease,這篇來看看AQS自身實現的doAcquire和doRelease acquire 獨佔鎖 AQS自身沒有提供對doAcquireInterruptibly和doAcquire

原创 基於AQS分析Condition

對於Object的wait和notify方法我們已經很熟悉了,同時也知道與之相似的Condition接口的await和signal,具體用法這裏不講,我們基於上一篇AQS的介紹來講講Condition的實現原理 等待隊列 Cond

原创 Semaphore實現原理

示例代碼 public class TestSemaphore { public static Semaphore semaphore=new Semaphore(2); public static void

原创 AQS子類的tryAcquire和tryRelease的實現

爲什麼要單獨將這部分抽出來總結? 縱觀JUC下基於AQS實現的工具類,其實現思想都很統一: state代表狀態值 通過try*()方法嘗試單次更改state,根據state當前情況決定是否進入do*()中 一旦進入了do*()中

原创 Redis緩存問題及解決方案

查詢流程: 【問題1】——穿透、擊穿及雪崩 問題描述 線程T1在查DB並更新redis緩存的過程中(還未成功將結果放入緩存),有大量併發請求對該Key請求,導致有大量的線程去走查DB並更新redis緩存的流程,不僅對DB造成巨大

原创 0代碼講解Java中AQS的實現原理

我們知道Java中的鎖有Synchronize和Lock,而Lock是基於隊列同步器AQS(AbstractQueuedSynchronizer)實現的,今天來分析一下到底什麼是AQS 這裏不貼代碼,只講思想原理,代碼其實很簡單,

原创 CyclicBarrier的實現原理

示例代碼 public class TestCyclicBarrier { public static CyclicBarrier barrier = new CyclicBarrier(4,()-> {

原创 AQS的非公平鎖與同步隊列的FIFO衝突嗎?

公平鎖與非公平鎖的含義都很明白,公平鎖必須排隊獲取鎖,鎖的獲取順序完全根據排隊順序而來,而非公平就是誰搶到是誰的。 我們都知道AQS中的鎖獲取,如果首次獲取失敗會進入到內部的同步隊列中阻塞等待,只有前面的節點喚醒當前節點才能去嘗試

原创 synchronize和Lock區別

以前一直說synchronize是一種重量級鎖,因爲以前synchronize是沒有鎖升級這個機制的,多個線程競爭鎖時沒有拿到鎖的會直接進入阻塞狀態,而後來引入了鎖升級後,synchronize便沒那麼重了,具體可參加我的另一篇文

原创 解析自定義MediaType的HttpMessageConverter

HandlerMethodReturnValueHandler和HandlerMethodArgumentResolver面向的是控制器返回值和方法入參類型,即當請求一個控制器方法時,SpringMVC根據請求的控制器的方法入參類

原创 劍指Offer刷題Java版——字符流中第一個不重複的字符

題目 請實現一個函數用來找出字符流中第一個只出現一次的字符。例如,當從字符流中只讀出前兩個字符"go"時,第一個只出現一次的字符是"g"。當從該字符流中讀出前六個字符“google"時,第一個只出現一次的字符是"l"。 如果當前

原创 SpringMVC中的InitBinder和Convert

SpringMVC中的參數綁定有兩種方法:InitBinder和Convert 後者我們已經很熟知了,這裏大概寫一下其用法 @Component public class MyConvert implements Converte

原创 Spring中的初始化和銷燬方法順序

順序如下: 無參構造方法 beanPostProcessor前置處理器方法 @PostConstruct標註的方法 initializingBean提供的afterPropertiesSet方法 自指定的init方法 beanP

原创 SpringMVC自定義ArgumentResolver實現自定義消息類型轉換

上篇的convert是基於RequestResponseBodyMethodProcessor的,因此入參和返回需要加@RequestBody和@ResponseBody 這裏我自己寫一個MyArgumentResolver來摒棄