原创 Java併發——鎖優化

鎖優化的背景   JDK5版本帶來了J.U.C包以及其他併發相關的技術,使得Java語言對於併發的支持更加完善。在這個基礎上,JDK6爲了更加高效的併發,Hotspot虛擬機的開發團隊花費了大量的精力去實現各種鎖優化的技術:自旋鎖

原创 Java進階硬核整理——(持續更新)

前言 針對Java的基礎知識, 在網絡上已經有很多精闢的總結了. 有時候站在巨人的肩膀上可以事半功倍!因此,這裏將整理出我認爲很有參考價值的總結鏈接. 這些文章十分適合剛入門Java需要進一步進階的開發者 or 學習者! 以下知識

原创 深入理解Java垃圾回收——對象已死?

Java語言經過幾十年的發展,其內存分配策略與內存回收策略已經發展的相當成熟,一切看起來都進入到了“自動化”的時代了。但是在通往高級開發人員的道路上,在遇到各種內存溢出、內存泄漏的問題時,當垃圾回收成爲高併發的瓶頸時,如果不瞭解內

原创 Java併發——這些工具類你用過嗎?

前言 J.U.C包中提供了一些非常有用的工具類。在合適的場景下使用它們往往能夠達到事半功倍的效果。比如Atomic工具類、Exchanger、CountDownLatch、CyclicBarrier、Semaphore這些。 At

原创 Java併發——ThreadLocal原理深度解析

前言 ThreadLocal在很多中間件、框架中都有大量的應用,在我們的實際工程開發中也有很多場景需要使用到。其主要作用就是提供線程安全的本地線程變量副本。要弄懂ThreadLocal的本質就聚焦於弄懂其是如何實現本地變量副本的。

原创 深入理解JVM內存模型(運行時數據區域)

Java虛擬機在執行Java程序的過程中會把它所管理的內存劃分爲若干個不同的數據區域。這些區域有各自的用途,以及創建和銷燬的時間,有的區域隨着虛擬機進程的啓動而一直存在,有些區域則是依賴用戶線程的啓動和結束而建立和銷燬。根據《Ja

原创 Java併發——Fork/Join框架原理解析

前言 最近有個哥們問我一個實際項目的問題,大致如下:需要給一個目錄下的所有文件的路徑生成對應的MD5簽名。這個哥們首先想到的是採用遞歸的方式處理,這個思路是沒問題的,但是完全沒有必要自己造輪子。因爲Java已經提供了成熟的工具可以

原创 Java併發——AQS源碼深度解析

一. AQS是什麼?   ASQ是AbstractQueuedSynchronizer的簡稱,它的類全限定名爲:java.util.concurrent.locks.AbstractQueuedSynchronizer. 後文中我

原创 Java併發——volatile關鍵字的核心

前言 在Java併發的話題中,volatile關鍵字一定是繞不開的話題。Java程序員都知道,volatile關鍵字的使用方式,以及它的特性:保證變量在內存中的可見性,但不保證原子性。Java的J.U.C包中volatile關鍵字

原创 Java併發——阻塞隊列原理解析

前言 在前文中非阻塞隊列之ConcurrentLinkedQueue源碼解析中,深度解析了非阻塞隊列的源碼。本篇內容將對於阻塞隊列的原理、4中處理方式以及7中阻塞隊列進行詳細解析。 什麼是阻塞隊列 首先,再一次申明,隊列必須是線程

原创 Java併發——非阻塞隊列之ConcurrentLinkedQueue源碼解析

前言 在Java併發體系中,很多併發場景都離不開隊列。比如Java中的定時任務框架、線程池框架、MQ等。本篇文章將記錄我的隊列學習之旅中的無阻塞隊列源碼學習。 線程安全性 首先,隊列必須是線程安全的,否則,在併發場編程中,就失去了

原创 Java併發——synchronized關鍵字性能分析

前言   所有Java開發者對於synchronized關鍵字都不陌生。 其實對於synchronized關鍵字的理解莫過於這幾個方面:對象在內存中的佈局、字節碼層面的執行指令—monitorenter-monitorexit、O

原创 Java併發——線程與Java線程

前言 對於大多數Java開發人員而言,在實際工作中很少遇到複雜的併發場景。最多可能也就用一下線程池來併發運行程序以提升執行效率。 雖然現狀如此,但這並非意味着我們簡單掌握併發的應用就可以了。在當今摩爾定律失效的情況下,併發處理成爲

原创 Java與動態類型

在JDK7以前,Java虛擬機層面對動態語言的支持一直有所欠缺。這是因爲方法調用的4個指令:invokevirtual、invokespecial、invokestatic、invokeinterface的第一個參數都是被調用方法

原创 方法調用——解析與分派

注意,方法調用並等同於方法中的代碼被執行!方法調用階段唯一做的事情就是確定被調用方法的版本。 我們知道,Class文件的編譯階段並不像其他傳統語言那樣會包含連接步驟,在Java語言中,連接步驟是在類的加載過程觸發,因此所有的方法調