原创 我手寫了AQS實現、畫了3張流程圖,就是爲了讓你徹底搞明白AQS原理

什麼是AQS 字面上來看,AQS是jdk1.5加入的java.util.concurrent.locks.AbstractQueuedSynchronizer類,類名翻譯成中文就是抽象的隊列同步器。由大名鼎鼎的Doug Lea李大

原创 詳解Java線程狀態及狀態轉換

爲何要了解Java線程狀態 線程是 JVM 執行任務的最小單元,理解線程的狀態轉換是理解後續多線程問題的基礎。 Java線程狀態轉換圖 圖:線程間的相互轉換 Java線程有哪些狀態? 在 JVM 運行中,線程一共有 NEW

原创 Java併發與多線程-詳解線程池

Java併發與多線程-詳解線程池 什麼是線程池? 在此,我們參考一下百科的定義: 線程池(英語:thread pool):一種線程使用模式。線程過多會帶來調度開銷,進而影響緩存局部性和整體性能。而線程池維護着多個線程,等待着監督

原创 使用jstack命令,排查線程死鎖問題

概述 使用jstack命令,排查線程死鎖問題。 jstack是什麼? jstack是java虛擬機自帶的一種堆棧跟蹤工具。jstack用於打印出給定的java進程ID或core file或遠程調試服務的Java堆棧信息 jst

原创 實戰-通過gc日誌觀察Java內存分配與回收策略

程序目的 通過gc日誌,詳細觀察java內存分配與回收策略 概要說明 爲方便觀察垃圾回收,指定Java堆大小,並指定年輕代大小,這樣當Eden區內存不夠時,會觸發Minor GC 通過-XX:+PrintGCDetails打印

原创 Mac上SSH連接工具推薦

之前用的是Mac自帶的終端,但是用着不方便。今天整理了一下,熟悉了SecureCRT的用法。 優勢 支持多Tab頁展示 支持保存密碼 支持樹形菜單管理多個環境的連接信息 上傳下載文件的支持 安裝 我用的版本是: V7.0.2

原创 JMM內存模型-多線程讀寫測試

概述 從JMM層面理解多線程對共享變量修改時的可見性問題。 源碼 /** * <pre> * 測試兩個線程,對同一個局部變量進行修改,是否可見 * 1、啓動[1號線程],啓動後,等待flag值變爲true,則繼續執行、然後

原创 volatile關鍵字不能保證原子性的示例

環境說明 jdk:1.8 OS:MacOS 10.13.4 源碼 /** * <pre> * 程序目的:測試volatile修飾的成員變量,是否具有原子性 * 主要流程: * 1. 創建容量爲10的Thread對象的

原创 教程:使用Charles抓取https的數據包

需求描述 在開發過程中,線上APP的http請求,多是https的。這給我們線上調試工作造成了不小的困擾。看到的都是類似下圖的亂碼: 接下來,我教大家如何使用Charles,抓取明文的https數據包。 親測有效。 保證手機和電

原创 Spring中RedisTemplate的使用

需求描述 一個查詢List的需求,如果redis有,就直接從redis中獲取List返回。如果沒有,則先查詢,再保存入redis中。使用RedisTemplate實現。 實現步驟 添加maven依賴 <dependency>

原创 SpringBoot中aop的使用

步驟 編寫使用註解的被攔截類,加了這個註解的類或者方法就會被攔截 使用@Aspect聲明一個切面,並通過@Component讓此切面成爲Spring容器管理的Bean 使用@After、@Befor、@Aroud定義建言(adv

原创 保留關鍵字(Reserved Words)導致的Jpa保存錯誤

使用Jpa操作數據庫時,如果字段名稱使用了數據庫保留關鍵字,會報錯: Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have a

原创 SQL模糊查詢排序問題

需求描述 查詢表中名字帶指定關鍵字的數據 完全匹配放在第一位 前匹配放在第二位 末尾匹配放在第三位 中間匹配放在第四位 建表 DROP TABLE IF EXISTS `t_user`; CREATE TABLE `t_use

原创 Java接口-多重繼承-Java編程思想

概述 最近把Java基礎知識梳理了一下,發現了一些以前理解有偏差的地方,記錄在此。 疑問 一個類同時繼承基類和多個接口時,該類中是否可以不實現接口中的方法? 一個類同時實現多個接口,能否向上轉型到各接口? 一個類同時實現多個接口

原创 Java源碼解析-迭代器

自己寫一個迭代器 /** * 迭代器接口 */ interface Selector { boolean end(); Object current(); void next(); } publi