原创 CyclicBarrier用法

CountDownLatch和CyclicBarrier CyclicBarrier在用法上其實跟CountDownLatch十分相似,但是前者功能更加強大。 CountDownLatch舉例: CountDownLatch co

原创 Semaphore用法

Semaphore的用法能夠實現CountDownLatch和CyclicBarrier的功能,與這兩者不同的是,Semaphore的計數器是累加的,當它的值等於acquire(n);要求的n時線程才能被喚醒。 Semaphore

原创 jvm(三)方法區、堆和虛擬機棧的指向關係

方法區、堆和虛擬機棧這三塊區域都是存在一定聯繫的,下面來一一分析下。 棧指向堆 什麼情況下,會存在棧指向堆呢?看一個代碼: private void A(){ User user=new User(); //todo } 線

原创 併發學習(一)終於明白了synchronized的實現原理

前提 大家應該都瞭解synchronized是能夠保證線程間的可見性以及原子性的吧,如果不瞭解,趕緊去看下我之前的文章。線程間的可見性 synchronized的幾種用法 我們平常使用synchronized其實也是非常簡單,在方

原创 併發學習(五)從ReentrantLock走進AQS

通過前面幾章的學習,我的腦海裏回顧最多的一句話就是:多個線程爭搶一把鎖,搶到鎖的線程執行下面的邏輯,沒搶到鎖的線程則阻塞。 下面來看一段ReentrantLock的簡單代碼: private Lock lock = new Ree

原创 併發學習(四)ReentrantReadWriteLock讀寫鎖

誕生背景 前面提到的synchronized加鎖基本都是排他鎖,也就是說只要是多線程競爭情況下,就只能有一個線程獲得鎖,其餘線程阻塞。雖然已經對synchronized進行性能優化了,但是這是從技術層面的優化,它的本質還是排他鎖。

原创 jvm(七)垃圾收集器

垃圾收集器 上一章介紹了垃圾回收算法,但是算法只是理論的一種可行性方案,還需要實際落地才行。於是乎,就有了好幾種基於垃圾回收算法而實現的垃圾回收器。 從圖中可以看出,一些算法收集器適用新生代,另一些算法收集器適用老年代。 1.S

原创 jvm(四)從設計者角度分析堆內存劃分結構

還記得運行時數據區的區域劃分嗎?再來回顧一下。 我們現在知道了方法區和堆是所有線程共享的區域,並且它們的生命週期跟jvm相同。存儲結構我們現在懂了,那麼不禁會想一個問題:萬一數據存滿了怎麼辦?一些垃圾數據怎麼清理的? 這就是通常

原创 【內存溢出了怎麼辦?】分析定位,解決問題

導出內存映射文件 1、內存溢出自動導出 參數配置: #當發生內存溢出,導出heap -XX:+HeapDumpOnOutOfMemoryError #導出到當前路徑下 -XX:HeapDumpPath=./ 在IDE

原创 併發學習(三)ReentrantLock可重入鎖

前面提到了Lock,但它只是一個接口,真正的實現代表類是ReentrantLock。 什麼是ReentrantLock 字面意思就很容易理解:可重入鎖。例如有一個線程A調用了lock方法獲得鎖後,再次調用lock,也能直接獲得鎖而

原创 maven打包命令-P和-D的用法

-D 我們工程裏一般有開發環境(dev)、測試環境(test)、現場環境(prod),如何使用maven命令來指定打哪個環境的war包呢? 首先,-D是針對配置屬性的。pom文件裏默認是dev環境,使用命令:mvn package