原创 JVM四種對象引用

前言 從 JDK1.2 版本開始,把對象的引用分爲四種級別,從而使程序能更加靈活的控制對象的生命週期。 強引用 例如,o就是一個強引用。 Object o = new Object(); 特點: 只要還有強引用指向一個對象,垃

原创 【P說】JVM內存模型

各個版本內存區域的變化 內存模型 程序計數器 程序計數器是一塊較小的內存空間,可看作當前線程正在執行的字節碼的行號指示器。在多線程環境下,程序計數器可以保證在線程發生切換時,可以記得自己的執行位置。同時,字節碼解釋器通過改變

原创 【P說】垃圾回收算法與內存分配策略

關於垃圾收集(Garbage Collection,GC) 顧名思義,所謂垃圾收集,就是對垃圾進行處理,在JAVA中,垃圾就是已經死亡的或者長時間沒有使用的對象,通過對這些對象進行處理,釋放他們佔用的空間,來防止內存溢出。 WHE

原创 【P說】初識Elasticsearch

前言 本文是對Elasticsearch官方權威指南的學習。 關於Elasticsearch Elasticsearch是一個基於Apache Lucene™的開源搜索引擎,它使用Java開發並使用Lucene作爲其核心來實現所有

原创 【P說】Spring基礎知識

Maven Spring Spring的Maven依賴: <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> <depend

原创 【P說】Java對象的創建、內存佈局、訪問定位

Java對象的創建 檢查加載 這是JVM對象加載的第一步。JVM遇到一條new指令時,首先檢查這個指令的參數是否能在常量池中定位到一個類的符號引用,並且檢查這個符號引用代表的類是否已被加載、解析和初始化過。如果沒有,那必須先執行

原创 【P說】深入理解JDK中的線程池

簡介 線程池是一種多線程處理形式,處理過程中將任務添加到隊列,然後已經創建好的線程會在隊列中獲取並自動啓動這些任務。 爲什麼要使用線程池 提高線程的可管理性,如果使用new Thread的方式,那麼每一個任務就會新建一個線程,線

原创 【P說】多線程HashMap產生死循環

簡介 在1.7及以前,使用HashMap進行put操作時,當元素超過閾值時,會觸發resize操作,這時候可能就會出現死循環的情況,導致CPU佔用率達到100%。 原因 歸根結底,就是JDK 1.7鏈表新節點採用的是頭插法,這樣在

原创 【P說】JDK 1.8 ConcurrentHashMap分析

簡介 相對JDK 1.7,ConcurrentHashMap在JDK 1.8有了很大的優化改動,底層的實現由原來的“segement數組+table數組+鏈表”改爲了“node數組+鏈表或者紅黑樹”。 關於ConcurrentHa

原创 【P說】深入理解Java阻塞隊列

簡介 阻塞隊列是一種隊列,一種可以在多線程環境下使用,並且支持阻塞等待的隊列。 當隊列滿的時候,插入元素的線程被阻塞,直達隊列不滿。 隊列爲空的時候,獲取元素的線程被阻塞,直到隊列不空。 方法 java的阻塞隊列,要實現Blo

原创 【P說】JDK 1.7及以前ConcurrentHashMap分析

簡介 ConcurrentHashMap可以理解爲多線程環境下HashMap,它是線程安全的。ConcurrentHashMap在JDK 1.7和JDK 1.8上的實現有很多區別,本文主要說明ConcurrentHashMap在J

原创 【P說】深入理解AQS

簡介 AQS全稱爲AbstractQueuedSynchronizer,是一個抽象類,主要是通過繼承的方式來使用,其內部維護了一個同步隊列,AQS是一個用來實現同步鎖以及其他涉及到同步功能的核心組件。 使用的設計模式 AQS使用了

原创 【P說】java位運算實現權限檢驗

可用來檢查某一個對象是否擁有某一個屬性或者擁有某一個權限。 //1,表示擁有select權限 public static final int SELECT = 1 << 0; //2,表示擁有delete權限 public st

原创 【P說】Exchanger

簡述 Exchanger用來線程之間進行數據交換,只能兩個線程進行數據交換。 例子 public class TestExchanger { static Exchanger<String> exchanger = new

原创 【P說】淺談CountDownLatch與CyclicBarrier

CountDownLatch CountDownLatch是一個同步工具類,用來協調多個線程之間的同步,CountDownLatch的作用與join方法類似,可以讓一個線程在收到其他線程的通知之後再進行執行,CountDownLa