原创 內存分配,回收策略與垃圾收集器

前序 Java內存區域的程序計數器,虛擬機棧,本地方法棧3個區域隨着線程而生,隨線程而滅;棧中的棧幀隨着方法的進入和退出而執行着出棧和入棧操作。每一個棧幀中分配多少內存基本在類結構確定下來時就已知了。因此這幾個區域的內存分配和回收都具有確

原创 併發容器和框架(Java併發編程的藝術筆記)

ConcurrentHashMap的實現原理與使用 線程不安全的HashMap 在多線程環境,使用HashMap進行put操作會引起死循環,原因是多線程會導致HashMap的Entry鏈表形成環狀數據結構,進而Entry的next節點永不

原创 線程池(Java併發編程的藝術筆記)

概述 線程池是運用場景最多的併發框架,幾乎所有需要異步或併發執行任務的程序 都可以使用線程池。 合理地使用線程池能夠帶來3個好處: 降低資源消耗。通過重複利用已創建的線程降低線程創建和銷燬造成的消耗 提高響應速度。當任務到達時,任務可以不

原创 Java中的原子操作類 / 併發工具類(Java併發編程的藝術筆記)

等待多線程完成的CountDownLatch CountDownLatch允許一個或多個線程等待其他線程完成操作,簡單使用如下。 public class Test { public static void main(Strin

原创 劍指offer部分題解

注:本文記錄leetcode和牛客網的部分題解 鏈表 複雜鏈表的複製 題目:輸入一個複雜鏈表(每個節點中有節點值,以及兩個指針,一個指向下一個節點,另一個特殊指針random指向任意一個節點),返回結果爲複製後複雜鏈表的head。 思路:

原创 leetcode——鏈表與雙指針

移動零 題目:給定一個數組 nums,編寫一個函數將所有 0 移動到數組的末尾,同時保持非零元素的相對順序。要求必須在原數組上操作,不能拷貝額外的數組。 示例: 輸入:[0,1,0,3,12] 輸出:[1,3,12,0,0] ------

原创 通信工具類

概述 本次我們將講述JUC包下的一些工具類 類 作用 Semaphore 限制線程的數量 Exchanger 兩個線程交換數據 CountDownLatch 線程等待直到計數器減爲0時開始工作 CyclicBarrier 作用跟Count

原创 併發容器集合ConcurrentHashMap

前序 在java.util包下提供了一些線程安全的容器類,如Vector和HashTable。但這些容器是通過sychronized實現實現同步,這樣讀寫均需要鎖操作,導致性能低下。Java提供了一些代替同步容器的併發容器,使用這些容器可

原创 併發容器集合ConcurrentLinkedQueue

概述 實現一個線程安全的隊列有兩種方式: (1)使用阻塞算法:用一個鎖 (入隊和出隊用同一把鎖)或兩個鎖(入隊和出隊用不同的鎖)等方式來實現。 (2)非阻塞算法:循環使用CAS。 ConcurrentLinkedQueue採用的是"wai

原创 Executor框架與線程池

Executor框架 在HotSpot VM的線程模型中,Java線程被一對一映射爲本地操作系統線程,Java線程啓動時會創建一個本地OS線程;當該Java線程終止時,這個OS線程也會被回收。OS會調度所有線程並將它們分配給可用的CPU。

原创 鎖接口和類

前序 synchronized的不足之處 之前我們介紹過Java原生的鎖——基於對象的鎖。它一般配合synchronized關鍵字使用。不過synchronized關鍵字也存在一些不足: (1)如果只是對臨界區進行讀操作的話,是可以多線程

原创 CAS與原子操作

CAS 什麼是CAS CAS是一種原子操作,一種系統源語,一條CPU的原子指令。CAS的全稱是比較並交換(Compare And Swap),它有三個值: V:要更新的變量(var) E:預期值(expected) N:新值(new) 該

原创 leetcode——貪心算法

55. 跳躍遊戲 題目:給定一個非負整數數組,你最初位於數組的第一個位置。 數組中的每個元素代表你在該位置可以跳躍的最大長度。 判斷你是否能夠到達最後一個位置。 示例 1: 輸入: [2,3,1,1,4] 輸出: true 解釋: 我們可

原创 多線程中的Java內存模型, 重排序與happens-before

Java內存模型基礎知識 JVM 如果你熟悉JVM,那麼你對這張圖絕不陌生。對於每一個線程來說,棧都是私有的,而堆是共有的。 也就是說,在棧中的變量(局部變量,方法定義參數,異常處理器參數)不會在線程間共享,也就不會有內存可見性的問題;