原创 HashMap 源碼淺析 1.7

Jdk 1.7 數據結構 1.7版本的HashMap採用數組加鏈表的方式存儲數據,數組是用來存儲數據的在數組的位置,鏈表則時用來存放數據的,由於根據hash可能發生碰撞,一個位置會出現多個數據,所以採用鏈表結構來存儲數據,結構如下圖所

原创 Java 併發工具CountDownLatch和CyclicBarrier 原理解析

[TOC] Java 併發工具CountDownLatch和CyclicBarrier 原理解析 一,簡介 CountDownLatch 允許一個或者多個線程等待其他線程完成操作。 CyclicBarrier 的字面意思是可循環使用(Cy

原创 LinkedTransferQueue 1.8 源碼解析

[TOC] LinkedTransferQueue 1.8 源碼解析 一,簡介 LinkedTransferQueue 是一個由鏈表結構組成的wujie阻塞傳輸隊列,它是一個很多隊列的結合體(ConcurrentLinkedQueue,

原创 SynchronousQueue 1.8 源碼解析

[TOC] SynchronousQueue 1.8 源碼解析 一,簡介 SynchronousQueue 是一個很奇怪的隊列,感覺都不能叫隊列,因爲內部沒有數據的存儲空間,隊列不能peek,因爲不存在元素,任何入隊的線程都會阻塞,直到

原创 PriorityBlockingQueue 1.8 源碼解析

[TOC] PriorityBlockingQueue 1.8 源碼解析 一,簡介 PriorityBlockingQueue 是一個支持優先級的×××阻塞隊列,數據結構採用的是最小堆是通過一個數組實現的,隊列默認採用自然排序的升序排序,

原创 LinkedBlockingQueue 1.8 源碼詳解

[TOC] LinkedBlockingQueue 1.8 源碼詳解 一,簡介 LinkedBlockingQueue 是一個用鏈表實現的有界阻塞隊列;此隊列的默認和最大長度爲Integer.MAX_VALUE;此隊列按照先進先出的原則對

原创 ArrayBlockingQueue 1.8 源碼淺析

[TOC] ArrayBlockingQueue 1.8 源碼淺析 一,簡介 ArrayBlockingQueue 是一個用數組實現的有界隊列;此隊列按照先進先出(FIFO)的規則對元素進行排序;默認情況下不保證線程公平的訪問隊列,所謂公

原创 ConcurrentLinkedQueue 1.8 源碼淺析

[TOC] ConcurrentLinkedQueue 1.8 源碼淺析 一,簡介 ConcurrentlinkedQueue 還是一個基於鏈表的,×××的,線程安全的單端隊列,它採用先進先出(FIFO)的規則對節點進行排序,當我們加入一

原创 ConcurrentHashMap 源碼淺析 1.8

一、簡介 前面的一篇文章我們介紹了ConcurrentHashMap1.7版本版本的源碼介紹,我們知道1.7版本的ConcurrentHashMap採用的是分段鎖的思想,提高了鎖的數量,提高了併發的特性,但是也有其侷限性,例如就是併發的數

原创 ReentrantReadWriteLock(可以重入的讀寫鎖)源碼淺析

一、ReentrantReadWriteLock簡介 上一篇文章我們將講到的ReentrantLock和Synchronized鎖,都屬於排他鎖,也就是說只會有一個線程獲取鎖;而我們今天講的ReentrantReadWriteLock(讀

原创 ReentrantLock (重入鎖) 源碼淺析

一、ReentrantLock簡介ReentrantLock重入鎖,顧名思義,就是支持重入的鎖,它表示能夠支持一個線程對資源的重複加鎖;我們之前學習過Synchronized鎖,它也是支持重入的一種鎖,參考我的另一篇Synchronized

原创 AbstractQueuedSynchroizer(AQS) 同步器詳解詳解

一、什麼是同步器同步器是用來構建鎖或者其他同步組件的基礎框架,它使用一個int成員變量表示同步狀態,通過內置的FIFO隊列來完成資源獲取線程的排隊工作,它能實現大部分的同步需求。同步器是實現鎖的關鍵,在鎖的實現中聚合同步器,利用同步器實現鎖

原创 Java 線程淺析

一、什麼是線程要理解什麼線程,我麼得先知道什麼是進程。現代操作系統在運行一個程序時,會爲其創建一個進程。例如啓動eclipse.exe其實就是啓動了win系統的一個進程。現代操作系統調度的最小單元就是線程,也叫輕量級進程,在一個進程裏面包含

原创 Volatile 關鍵字淺析

1. volatile的定義Java編程語言允許線程訪問共享變量,爲了確保共享變量能被準確和一致性地更新,線程應該確保通過排他鎖單獨獲取這個變量。Java語言提供了volatile,在某些情況下比鎖更加方便。如果一個字段被聲明成volati

原创 從硬件緩存模型到Java內存模型原理淺析

參考Google的這個問題what is a store buffer?一、硬件方面的問題1、背景在現代系統的CPU中,所有的內存訪問都是通過層層緩存進行的。CPU的讀/寫(以及指令)單元正常情況下甚至都不能直接與內存進行訪問,這是物理結構