原创 算法與數據結構系列之[隊列]

上一篇介紹了棧這種數據結構,棧是從線性表的表尾進並從表尾出,即後進先出,先進後出,若是銀行排隊採用這種方式,估計先去的人都氣死了。那麼有沒有先進先出,類似於銀行排隊這種方式的數據結構呢?答案是肯定的,隊列就是這樣先進先出(FIF

原创 算法與數據結構系列之[鏈表]

上一篇介紹了線性表的順序存儲結構,順序存儲結構的最大缺點就是插入和刪除時需要移除大量元素,如果要插入或刪除的數據量很大的話,執行程序的時間就會很長,造成一定的性能消耗,且線性表的順序存儲結構如動態數組,棧和隊列,底層依託靜態數組

原创 算法與數據結構系列之[並查集-中]

上篇介紹了並查集的基本實現,這篇介紹幾種並查集的優化方法。 1.基於size優化: 上一篇當中樹實現並查集的方法中對要合併的兩個元素所在的樹的形狀沒有做任何的判斷,合併的過程中可能不斷增加樹的高度,使查找的性能變差,甚至在極端情況

原创 Spring源碼調試環境搭建

一、實驗環境 1.jdk1.8.0_171 2.gradle-5.3.1(Spring源碼使用gradle構建的,關於gradle的安裝和配置使用,請讀者自行上網搜一下,這裏不再贅述) 3.IntelliJ IDEA 2019.2

原创 算法與數據結構系列之[二叉樹-上]

上篇從整體上介紹了樹的一些基本概念,編程中我們用到的都是具體的樹結構,比如二叉樹。接下來我們用上、中、下三篇詳細介紹二叉樹,其中上篇爲二叉樹的理論部分,中篇爲二叉樹的C語言代碼實現,下篇爲二叉樹的Java代碼實現。 前言 現實中樹

原创 Ubuntu下編譯openjdk11

前言 我的另一篇文章:Ubuntu下編譯openjdk8 已經編譯了openjdk8的版本,現在需要用到openjdk11的HotspotJVM,所以就編譯一下openjdk11,把不同的部分記錄下來,openjdk11的準備部

原创 java中鎖的分類

一、java中的鎖從以下幾個方面進行劃分類別: 1.線程是否要鎖住同步資源: 鎖住:悲觀鎖 不鎖住: 樂觀鎖 CAS 2.鎖住同步資源失敗,線程是否要阻塞: 阻塞 不阻塞: 自旋鎖 適應性自旋鎖

原创 Unsafe類源碼解析

前言 Unsafe,顧名思義,一個不安全的類,那麼jdk的開發者爲什麼要設計一個不安全的類呢?這個類爲什麼會不安全呢?現在就讓我們來揭開Unsafe類的神祕面紗。 1.概述 作爲java開發者的我們都知道,java是沒有指針的

原创 JVM源碼調試環境搭建

前言: 上篇文章我們介紹瞭如何在Ubuntu中編譯openjdk,包括hotspotJVM,編譯完之後大家就要開始閱讀jvm源碼了,爲了讓大家能夠流暢地閱讀和調試jvm源碼,這篇介紹下如何搭建jvm源碼調試環境,使之能夠在IDE

原创 volatile底層實現原理

前言 當共享變量被聲明爲volatile後,對這個變量的讀/寫操作都會很特別,下面我們就揭開volatile的神祕面紗。 1.volatile的內存語義 1.1 volatile的特性 一個volatile變量自身具有以下三個

原创 撩我

你好,我是掃地僧,對java尤其編譯器和虛擬機有濃厚興趣,我是一個渴望通過努力成爲技術大牛的理想主義者,相信你也希望自己能夠成爲技術大佬,歡迎關注我的博客,我們一起成長,共同進步! 1.簡書2.csdn3.知乎專欄4.頭條號

原创 volatile底層實現原理

前言 當共享變量被聲明爲volatile後,對這個變量的讀/寫操作都會很特別,下面我們就揭開volatile的神祕面紗。 1.volatile的內存語義 1.1 volatile的特性 一個volatile變量自身具有以下

原创 CAS算法

前言 CAS,即 Compare And Swap(比較與交換),是一種無鎖算法,基於硬件原語實現,能夠在不使用鎖的情況下實現多線程之間的變量同步。jdk中的java.util.concurrent.atomic包中的原子類就是

原创 Java內存模型詳解

前言 Java內存模型(Java Memory Model,簡稱JMM),即Java虛擬機定義的一種用來屏蔽各種硬件和操作系統的內存訪問差異,以實現讓java程序在各種平臺下都能夠達到一致的內存訪問效果的內存模型。本篇文章大致設

原创 函數式接口

概述 java8中新增了 @FunctionalInterface 註解表示函數式接口,用註解@FunctionalInterface標識的接口都是函數式接口,函數式接口只能有一個抽象方法,但除了抽象方法,java8還允許接口中定