原创 多線程核心知識:原子性

1、原子性問題 原子操作定義:原子操作可以是一個步驟,也可以是多個操作步驟,但是其順序不可以被打亂,也不可以被切割而只執行其中的一部分(不可中斷性)。將整個操作視爲一個整體是原子性的核心特徵。 存在競爭條件,線程不安全,需要轉變原子操作才

原创 如何解決Redis緩存雪崩、緩存穿透、緩存併發等5大難題

緩存雪崩 數據未加載到緩存中,或者緩存同一時間大面積的失效,從而導致所有請求都去查數據庫,導致數據庫CPU和內存負載過高,甚至宕機。 比如一個雪崩的簡單過程: 1、redis集羣大面積故障 2、緩存失效,但依然大量請求訪問緩存服務redi

原创 詳解RPC遠程調用和消息隊列MQ的區別

RPC RPC(Remote Procedure Call)遠程過程調用,主要解決遠程通信間的問題,不需要了解底層網絡的通信機制。 RPC框架 知名度較高的有Thrift(FB的)、dubbo(阿里的)。 RPC的一般需要經歷4個步驟:

原创 Redis爲什麼是單線程、及高併發快的3大原因詳解

Redis的高併發和快速原因 1.redis是基於內存的,內存的讀寫速度非常快; 2.redis是單線程的,省去了很多上下文切換線程的時間; 3.redis使用多路複用技術,可以處理併發的連接。非阻塞IO 內部實現採用epoll,採用了e

原创 Redis併發競爭key的解決方案詳解

Redis高併發的問題 Redis緩存的高性能有目共睹,應用的場景也是非常廣泛,但是在高併發的場景下,也會出現問題: 高併發架構系列:Redis緩存和MySQL數據一致性方案詳解 如何解決Redis緩存雪崩、緩存穿透、緩存併發等5大難題

原创 分佈式鎖

什麼是分佈式鎖 要介紹分佈式鎖,首先要提到與分佈式鎖相對應的是線程鎖、進程鎖。 1.線程鎖 主要用來給方法、代碼塊加鎖。當某個方法或代碼使用鎖,在同一時刻僅有一個線程執行該方法或該代碼段。線程鎖只在同一JVM中有效果,因爲線程鎖的實現在根

原创 RPC框架的實現原理,及RPC架構組件詳解

RPC的由來 隨着互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分佈式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。  單一應用架構  當網站流量很小時,只需一個應用,將所有功能都部署在一

原创 ConcurrentHashMap的實現原理(JDK1.7和JDK1.8)

哈希表 1.介紹   哈希表就是一種以 鍵-值(key-indexed) 存儲數據的結構,我們只要輸入待查找的值即key,即可查找到其對應的值。 哈希的思路很簡單,如果所有的鍵都是整數,那麼就可以使用一個簡單的無序數組來實現:將鍵作爲索引

原创 CountDownLatch、Semaphore等4大併發工具類詳解

1.CountDownLatch 功能 CountDownLatch是一個同步的輔助類,允許一個或多個線程,等待其他一組線程完成操作,再繼續執行。 原理:  CountDownLatch是通過一個計數器來實現的,計數器的初始值爲需要等待線

原创 獨享鎖/共享鎖+公平鎖/非公平鎖+樂觀鎖/悲觀鎖

樂觀鎖 VS 悲觀鎖 樂觀鎖與悲觀鎖是一種廣義上的概念,體現了看待線程同步的不同角度,在Java和數據庫中都有此概念對應的實際應用。 1.樂觀鎖 顧名思義,就是很樂觀,每次去拿數據的時候都認爲別人不會修改,所以不會上鎖,但是在更新的時候會

原创 Java線程池的使用方式,核心運行原理、以及注意事項

線程池的處理流程   就以ThreadPoolExecutor爲例,當我們把一個Runnable交給線程池去執行的時候,這個線程池處理的流程是這樣的:  先判斷線程池中的核心線程們是否空閒,如果空閒,就把這個新的任務指派給某一個空閒線程

原创 多種多線程鎖機制的實現方式與比較

Java提供了多種多線程鎖機制的實現方式,常見的有:  synchronized  ReentrantLock  Semaphore  AtomicInteger等 每種機制都有優缺點與各自的適用場景,必須熟練掌握他們的特點才能在Java

原创 CyclicBarrier學習

概述 字面意思迴環柵欄,通過它可以實現讓一組線程等待至某個狀態之後再全部同時執行。叫做迴環是因爲當所有等待線程都被釋放以後,CyclicBarrier可以被重用。我們暫且把這個狀態就叫做barrier,當調用await()方法之後,線程就

原创 Semaphore學習

Semaphore是一種在多線程環境下使用的設施,該設施負責協調各個線程,以保證它們能夠正確、合理的使用公共資源的設施, 也是操作系統中用於控制進程同步互斥的量。Semaphore是一種計數信號量,用於管理一組資源,內部是基於AQS的共享

原创 CountDownLatch學習

概述 CountDownLatch能夠使一個線程在等待另外一些線程完成各自工作之後,再繼續執行。使用一個計數器進行實現。計數器初始值爲線程的數量。當每一個線程完成自己任務後,計數器的值就會減一。當計數器的值爲0時,表示所有的線程都已經完成