原创 Java 多線程三大核心

原子性 Java 的原子性就和數據庫事務的原子性差不多,一個操作中要麼全部執行成功或者失敗。 JMM 只是保證了基本的原子性,但類似於 i++ 之類的操作,看似是原子操作,其實裏面涉及到: 獲取 i 的值。 自增。 再賦值給 i。

原创 volatile 關鍵字

內存可見性 由於 Java 內存模型(JMM)規定,所有的變量都存放在主內存中,而每個線程都有着自己的工作內存(高速緩存)。 線程在工作時,需要將主內存中的數據拷貝到工作內存中。這樣對數據的任何操作都是基於工作內存(效率提高),並且不

原创 ConcurrentHashMap 實現原理

由於 HashMap 是一個線程不安全的容器,主要體現在容量大於總量*負載因子發生擴容時會出現環形鏈表從而導致死循環。 因此需要支持線程安全的併發容器 ConcurrentHashMap 。 JDK1.7 實現 數據結構 如圖所示

原创 三元運算符 報錯 java.lang.NullPointerException

@Setter @Getter @ToString public class Student { private Integer age; private Integer year; } public static voi

原创 表達異常的分支時,少用 if-else 方式(可以使用衛語句、策略模式或者狀態模式來實現)

避免後續代碼維護困難, if-else儘量不要超過3層, 可以嘗試使用衛語句、策略模式或者狀態模式 衛語句: 衛語句就是把複雜的條件表達式拆分成多個條件表達式,比如一個很複雜的表達式,嵌套了好幾層的if -else語句,轉換爲多個if

原创 類加載機制

雙親委派模型 模型如下圖: 雙親委派模型中除了啓動類加載器之外其餘都需要有自己的父類加載器 當一個類收到了類加載請求時: 自己不會首先加載,而是委派給父加載器進行加載,每個層次的加載器都是這樣。 所以最終每個加載請求都會經過啓動類加

原创 HashMap 底層分析

以下基於 JDK1.7 分析。 如圖所示,HashMap 底層是基於數組和鏈表實現的。其中有兩個重要的參數: 容量 負載因子 容量的默認大小是 16,負載因子是 0.75,當 HashMap 的 size > 16*0.75 時就

原创 LinkedHashMap 底層分析

衆所周知 HashMap 是一個無序的 Map,因爲每次根據 key 的 hashcode 映射到 Entry 數組上,所以遍歷出來的順序並不是寫入的順序。 因此 JDK 推出一個基於 HashMap 但具有順序的 LinkedHas

原创 異步轉同步操作 使用 CountDownLatch

進行異步轉同步操作,使用CountDownLatch時,每個線程退出前必須調用 countDown方法。 說明: CountDownLatch是在java1.5被引入的,它存在於java.util.concurrent包下。Count

原创 HashSet 底層分析

HashSet 是一個不允許存儲重複元素的集合,它的實現比較簡單,只要理解了 HashMap,HashSet 就水到渠成了。 成員變量 private transient HashMap<E,Object> map; //

原创 STS(eclipse)參數配置

-startup plugins/org.eclipse.equinox.launcher_1.5.0.v20180512-1130.jar --launcher.library plugins/org.eclipse.equinox

原创 Integer == 和 equals 的區別

當裝包對象在IntegerCache.low到Integer.high之間時,結果直接從 IntegerCache中獲取,否則直接創造一個實例。源碼如下: /** * Returns an {@code Integer

原创 Java8 Lambdas及函數式接口的例子

使用案例 Lambda 的例子 對應的函數式接口 布爾表達式 (List list) -> list.isEmpty() Predicate<List<>> 創建對象 () -> new Apple(10) Supp

原创 SQL 優化

負向查詢不能使用索引 select name from user where id not in (1,3,4); 應該修改爲: select name from user where id in (2,5,6); 很多時候用 e

原创 i++ 或者 ++i 是線程安全的嗎。

不論是++i還是i++都不是原子操作,在運行中都可能會有CPU調度產生,造成i的值被修改,造成髒讀髒寫。 volatile不能解決這個線程安全問題。因爲volatile只能保證可見性,不能保證原子性。 可以用鎖。使用syn