原创 java鎖(4)隊列同步器AQS詳解

1、AQS簡介 AQS(java.util.concurrent.locks.AbstractQueuedSynchronizer)是用來構建鎖或者其他同步組件(信號量、事件等)的基礎框架類。JDK中許多併發工具類的內部實現都依賴於AQS,

原创 java鎖(5)可重入鎖ReentrantLock實現詳解

1、ReentrantLock的特性 ReentrantLock是Java併發包中提供的一個可重入的互斥鎖。ReentrantLock和synchronized在基本用法,行爲語義上都是類似的,同樣都具有可重入性。只不過相比原生的Synch

原创 java鎖(7)改進讀寫鎖StampedLock詳解

1、StampedLock特性 StampedLock是JDK 8新增的讀寫鎖,跟讀寫鎖不同,它並不是由AQS實現的。它的state爲一個long型變量,狀態的設計也不同於讀寫鎖,且提供了三種模式來控制 read/write 的獲取,並且內

原创 java鎖(3)Lock接口及LockSupport工具詳解

1、Lock接口 1.1、Lock玉synchronized的不同 Lock不是Java語言內置的,synchronized是Java語言的關鍵字,因此是內置特性。Lock是一個類,通過這個類可以實現同步訪問; Lock和synchroni

原创 java鎖(2)volatile及synchronized

1、volatile實現及應用 volatile是輕量級的synchronized,它在多處理器開發中保證了共享變量的“可見性”。可見性的意思是當一個線程修改一個共享變量時,另外一個線程能讀到這個修改的值。如果volatile變量修飾符使用

原创 java鎖(8)工具類CountDownLatch、CyclicBarrier、Semaphore詳解

1、CountDownLatch實現 CountDownLatch的實現基於AQS的共享模式,其Sync實現如下: private static final class Sync extends AbstractQueuedSynchron

原创 java鎖(6)讀寫鎖ReentrantReadWriteLock實現詳解

1、ReentrantReadWriteLock特性 1.1、公平性 非公平鎖(默認):這個和ReentrantLock的非公平性一樣,由於讀線程之間沒有鎖競爭,所以讀操作沒有公平性和非公平性,寫操作時,由於寫操作可能立即獲取到鎖,所以會

原创 java鎖(1)java內存模型

1、內存模型基礎 在併發編程中,需要處理兩個關鍵問題:線程之間如何通信及線程之間如何同步。通信是指線程之間以何種機制來交換信息。在命令式編程中,線程之間的通信機制有兩種:共享內存和消息傳遞。 在共享內存的併發模型裏,線程之間共享程序的公共狀

原创 JVM(2)垃圾收集器

1、對象存活 內存回收與分配重點關注的是堆內存和方法區內存(程序計數器佔用小,虛擬機棧和本地方法棧隨線程有相同的生命週期)。 1.1、引用計數算法 給對象中添加一個引用計數,每當有一個地方引用它時,計數器加一;當引用失效時,計數器減一;當計

原创 JVM(5)分析工具

給系統定位問題的時候,知識、經驗是關鍵基礎,數據是依據,工具是運用知識處理數據的手段。這裏說的數據包括:cpu、網絡、內存、磁盤、運行日誌、異常堆棧、 GC 日誌、線程快照 ( threaddump/javacore 文件)、堆轉儲快照(

原创 JVM(6)性能調優

1、內存分配相關調優 1.1、最大與最小堆內存設置 Java 應用程序在運行時,首先會被分配 -Xms 指定的內存大小,並儘可能嘗試在這個空間段內運行程序。當 -Xms 指定的內存大小確實無法滿足應用程序時, JVM 纔會向操作系統中請更多

原创 JVM(4)解釋器和即時編譯器

1、虛擬機運行模式 java是一種解釋性編程語言,在Hotspot實現中,提供瞭解釋器和即時編譯器,即時編譯器能將熱點代碼編譯爲效率更高的機器代碼,以提升執行效率,加快系統運行速度。 hotspot運行模式配置: 解釋模式:可通過 -X

原创 dubbo源碼愫讀(8) dubbo的集羣、路由、負載均衡策略分析

dubbo是一個分佈式服務框架,能避免單點故障和支持服務的橫向擴容。一個服務通常會部署多個實例,同時一個服務能註冊到多個註冊中心。如何從多個服務 Provider 組成的集羣中挑選出一個進行調用,就涉及到一個負載均衡的策略。 1、dubbo

原创 dubbo應用筆記(2)基於Filter、RpcContext隱藏參數及SLF的MDC的服務調用鏈日誌跟蹤

使用dubbo做分佈式服務,當查看日誌時,需要在多個應用中對日誌進行查詢;若一個接口被多個客戶端同時調用,則會出現日誌查找辨別非常困難,無法及時定位錯誤。 本示例基於MVC攔截器、Dubbo的Filter及SLF的MDC實現,原理爲在客戶端

原创 JVM(1)內存模型

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