原创 依賴注入3種方式(xml實現)

構造器注入 構造器注入依賴於構造方法實現,而構造方法可以是有參和無參的 比如有構造器爲: public Test(String id,String name){ this.id = id ; this.name

原创 FastJson的使用——複雜的JSON獲取指定的key-value,JSON與list,object的互轉

對象轉JSON String json = JSON.toJSONString(object); JSON轉對象 首先你需要構造一個對象實體類,且還需要攜帶一個無參構造器,比如: @Data public class User im

原创 解讀可重入鎖——ReentrantLock&AQS,java8

一 , ReentrantLock簡介   首先我們可以查看ReentrantLock類,實現了Lock接口,其內部類都直接或者間接的繼承了AQS類,則AQS肯定與ReentrantLock關係密切 我們來個demo,讓大家更直接的瞭

原创 調用wait,notify,sleep方法對鎖資源的處理

  我們知道wait和sleep方法可以將一個線程阻塞的目的。wait是將線程從Running變爲waiting,直到被notify或者notifyAll,纔會將線程從waiting狀態變成Runnable狀態。sleep是在一段時間內將

原创 ReentrantReadWriteLock源碼分析,java8

一,關係簡介 二, 實現   2.1 Sync的成員變量   2.2 構造器   2.3 lock()   2.4 ReadLock.lock()流程圖 關係簡介   在這個關係很亂的UML圖中,我們可以發現ReentrantRe

原创 SpringMVC攔截器介紹

前言   攔截器是SpringMVC非常重要的一個功能,主要作用是攔截用戶的請求並進行相應的處理。      SpringMVC攔截器是可插拔式的設計,需要使用哪個攔截器,在配置文件配置就可以。不管是是否使用某個攔截器,對Spring

原创 通過demo對比了解Volatile的實現

Volatile的定義   volatile可以保證線程可見性且提供了一定的有序性,但是無法保證原子性。在JVM底層volatile是採用“內存屏障”來實現的。   上面的定義有兩層含義:   1,保證共享變量的可見

原创 Java堆——Tlab分析,介紹

首先談java對象的創建 我們在語言層面上,創建一個對象僅僅是一個new關鍵字可以解決的。 但是在JVM層面上是怎麼創建一個對象的呢?? 當 jvm 遇到 new 指令 1,檢查指令的參數能否在常量池中定位到一個類的符號引用。並檢查這個

原创 Web項目中使用log4j,指定日誌輸出文件

  使用log4j在web項目中,需要打印日誌到文件中。使用相對路徑,默認的是相對於tomcat的bin目錄下。頓時覺得很坑。尋找解決到相對於項目之下,踩了很多坑。最後決定自己實現配置加載處理,就不會出現什麼問題。   使用servlet

原创 通過Condition實現wait與指定線程notify

  Object 的 wait / notify / notifyAll 幾個方法可以實現對線程的掛起和喚醒。ReentrantLock 也可以,不過要藉助我們的 Condition 條件監視器,而且 Object 喚醒部分縣城是隨機喚醒

原创 聚簇索引和非聚簇索引的區別

引言   聚簇索引並不是一種索引類型,只是一種存儲方式。當表有了聚簇索引的時候,表的數據行都存放在索引樹的葉子頁中。無法把數據行放到兩個不同的地方,所以一張表只允許有一個聚簇索引。   索引使得大多數時候我們避免全表掃描,使數據的性能有

原创 二叉搜索樹(java實現)

目錄   1 .插入元素思想與實現   2 .刪除元素思想與實現   3 .完整代碼 二叉搜索樹定義 二叉搜索樹,也稱有序二叉樹,排序二叉樹,是指一棵空樹或者具有下列性質的二叉樹: 若任意節點的左子樹不空,則左子樹上所有結點的

原创 Redis cluster集羣發生(error)

(error) MOVED 14990 xxxxx:7003 錯誤解決方法爲 啓動客戶端加 -c參數

原创 Redis實現——String類型(sds)

前言 Redis底層是使用C語言實現的,對於字符串類型,其做出了改進,是一種基於動態字符串sds實現,redis作爲數據庫,查詢必然多,修改也會有一定多,sds解決了C語言字符串動態擴展的不方便,以及查詢長度操作從O(n)變爲了O(1

原创 java十六進制轉爲byte類型

借用Integer類型轉換 byte c = Integer.valueOf("ca",16).byteValue(); byte c = (byte) Integer.parseInt("ca", 16); 直接強轉 byte b =