原创 redis分佈式鎖原理
以redisson爲例 RLock lock = redissonClient.getLock(key); lock.lock(timeoutSecond, TimeUnit.SECONDS);
原创 HotSpot的算法實現
枚舉根節點 由於目前的主流Java虛擬機使用的都是準確式GC,當執行系統停頓下來後,並不需要一個不漏地檢查完所有執行上下文和全局的引用位置,虛擬機應當是有辦法直接得知哪些地方存放着對象引用。 在HotSpot的實現中,是使
原创 獨佔式超時獲取同步狀態
通過調用同步器的doAcquireNanos(int arg,long nanosTimeout)方法可以超時獲取同步狀態,即在指定的時間段內獲取同步狀態,如果獲取到同步狀態則返回true,否則,返回false。超時獲取同步狀
原创 Executors
1. 介紹 線程池工廠,在實際生產環境中,線程的數量必須得到控制,盲目的大量創建線程對系統性能是有傷害的。 2. 主要方法 2.1 newFixedThreadPool() 該方法返回一個固定線程數量的線程池,該線程池中的線程
原创 判斷對象是否存活
引用計數法 互相引用會無法回收 可達性分析法 通過一系列的GC Roots的對象作爲起始點,從這些節點開始向下搜索,搜索走過的路徑稱爲引用鏈(Reference Chain),當一個對象到GC Roots沒有任何引用鏈相連
原创 Condition實現分析
ConditionObject是同步器AbstractQueuedSynchronizer的內部類,因爲Condition的操作需要獲取相關聯的鎖,所以作爲同步器的內部類也較爲合理。每個Condition對象都包含着一個隊列
原创 共享式同步狀態獲取與釋放
共享式獲取與獨佔式獲取最主要的區別在於同一時刻能否有多個線程同時獲取到同步狀態 public final void acquireShared(int arg) { if (tryAcquireShared(arg) <
原创 雙重檢查幾種方案
有時候需要採用延遲初始化來降低初始化類和創建對象的開銷。雙重檢查鎖定是常見的延遲初始化技術,但它是一個錯誤的用法。 在Java程序中,有時候可能需要推遲一些高開銷的對象初始化操作,並且只有在使用這些對象時才進行初始化。此時
原创 對象的創建過程
虛擬機遇到一條new指令時,首先將去檢查這個指令的參數是否在常量池中定位到一個類的符號引用,並且檢查這個符號引用代表的類是否已被加載、解析和初始化過。如果沒有,那必須執行相應的類加載過程。 類加載檢查通過後,接下來虛擬機將
原创 CyclicBarrier
1. 介紹 它可以實現線程間的計數等待,並且可以循環計數。每湊齊一批後又可以繼續重新計數。 2. 構造函數 public CyclicBarrier(int parties); public CyclicBarrier(int
原创 AQS簡介
隊列同步器AbstractQueuedSynchronizer(以下簡稱同步器),是用來構建鎖或者其他同步組件的基礎框架,它使用了一個int成員變量表示同步狀態,通過內置的FIFO隊列來完成資源獲取線程的排隊工作,併發包的作者
原创 對象的內存佈局
在HotSpot虛擬機中對象在內存中存儲的佈局可以分爲3塊區域:對象頭(Header)、實例數據(Instance Data)和對其填充(Padding) 對象頭 對象頭包括三部分 第一部分Mark Word,用
原创 重排序
在執行程序時,爲了提高性能,編譯器和處理器常常會對指令做重排序。重排序分3種類型。 1)編譯器優化的重排序。編譯器在不改變單線程程序語義的前提下,可以重新安排語句的執行順序。 2)指令級並行的重排。現代處理器採用了指令級並行技術(
原创 Java內存模型的概念
1. 併發編程模型的兩個關鍵問題 在併發編程中,需要處理兩個關鍵問題:線程之間如何通信及線程之間如何同步(這裏的線程是指併發執行的活動實體) 通信是指線程之間以何種機制來交換信息。在命令式編程中,線程之間的通信機制有兩種:
原创 CAS原理
compareAndSet()方法調用簡稱爲CAS。JDK文檔對該方法的說明如下:如果當前狀態值等於預期值,則以原子方式將同步狀態設置爲給定的更新值。此操作具有volatile讀和寫的內存語義。 編譯器不會對volatil