原创 Java多線程進階(九):線程安全和死鎖

什麼叫線程安全? 線程安全就是多線程訪問時,採用了加鎖機制,當一個線程訪問該類的某個數據時,進行保護,其他線程不能進行訪問直到該線程讀取完,其他線程纔可使用。不會出現數據不一致或者數據污染。 如果線程不安全會出現什麼情況? 舉個例

原创 Java多線程進階(十一):ReentrantReadWriteLock

前面提到ReentrantLock,是一種“排它鎖”。也就是說,這些鎖在同一時刻只允許一個線程進行訪問。而讀寫鎖可以再同一時刻允許多個讀線程訪問。Java提供了ReentrantReadWriteLock類作爲讀寫鎖的默認實現,內

原创 Java多線程進階(十八):Java 8 Stream並行計算

從Java 8 開始,我們可以使用Stream接口以及lambda表達式進行“流式計算”。它可以讓我們對集合的操作更加簡潔、更加可讀、更加高效。 Stream接口有非常多用於集合計算的方法,比如判空操作empty、過濾操作filt

原创 Java多線程進階(三):Callable、Future與FutureTask

通常來說,我們使用Runnable和Thread來創建一個新的線程,但是它們是沒有返回值的。而有時候我們希望開啓一個線程去執行一個任務,並且這個任務執行完成後有一個返回值。 那麼JDK提供了Callable接口與Future類爲我

原创 Java多線程進階(八):樂觀鎖和悲觀鎖

鎖可以從不同的角度分類。其中,樂觀鎖和悲觀鎖是一種分類方式。 悲觀鎖 悲觀鎖就是我們常說的鎖。對於悲觀鎖來說,它總是認爲每次訪問共享資源時會發生衝突,所以必須對每次數據操作加上鎖,以保證臨界區的程序同一時間只能有一個線程在執行。

原创 Java多線程進階(五):Synchronized和鎖

首先需要明確的一點是:Java多線程的鎖都是基於對象的,Java中的每一個對象都可以作爲一個鎖,也就是說我們常聽到的類鎖其實也是對象鎖。 synchronized這個關鍵字,它翻譯成中文就是“同步”的意思。 爲避免競爭狀態,應該防

原创 Java多線程進階(七):CAS

CAS的概念 CAS的全稱是:比較並交換(Compare And Swap)。在CAS中,有這樣三個值: V:要更新的變量(var) E:預期值(expected) N:新值(new) 比較並交換的過程如下: 判斷V是否等於E

原创 Java多線程進階(四):Java線程的狀態

首先從一張圖片來直觀的瞭解一下線程的狀態,圖片來源於網絡。 然後再看一下Thread.State這個枚舉類,定義了線程的六種狀態。 public enum State { /** * 處於NE

原创 Java多線程進階(十七):Fork/Join框架

淺談Java的Fork/Join併發框架 Fork/Join 框架-設計與實現(翻譯自論文《A Java Fork/Join Framework》原作者 Doug Lea) 如何使用 ForkJoinPool 以及原理 jdk1

原创 Dubbo進階(一):RPC和RESTful

想要比較清楚的瞭解RPC和RESTful的區別,我們先來了解一下網絡的七層模型。 OSI網絡模型 圖片來自網絡 我們可以清楚的看到OSI模型一共有七層,從上到下分別是: 第一層應用層。定義了用於在網絡中進行通信和傳輸數據的接口

原创 Dubbo進階(二):Dubbo是什麼

在當今微服務盛行的大環境下,設計一套高併發、高可擴展、自動容錯和高可用的分佈式系統無疑是離不開一套優秀的RPC框架的。Dubbo是阿里開源的RPC框架,在市場上衆多RPC框架中是最受歡迎的,各大公司也都爭相擁抱和使用。 Dubbo

原创 微服務中如何處理全局異常

微服務中,全局異常處理是一個必須解決的客觀課題,如果這些異常處理不好的話,就會給用戶看到一些不友好的錯誤信息,比如客戶看到了空指針異常,SQL執行錯誤等異常,客戶肯定是看不懂的,從而大大降低用戶體驗。 全局異常處理的常見解決方案

原创 Dubbo進階(十三):Directory的實現

首先我們依然再看一遍Dubbo調用的流程 本文我們主要分析Directory。 首先通過UML來看下Directory的層級結構 從這個UML圖上可以看到,依然使用了模板模式。AbstractDirectory是一個抽象類,封

原创 Dubbo進階(十四):Router的實現

首先我們依然再看一遍Dubbo調用的流程 Router是什麼 Router是一種約定的規則,路由規則決定了服務消費者的調用目標,即規定了服務消費者可調用哪些服務提供者。比如服務A配置了調用的服務的IP是192.168.1.1,那

原创 Java多線程進階(十五):線程池的使用

爲什麼要使用線程池 創建/銷燬線程需要消耗系統資源,線程池可以複用已創建的線程。 控制併發的數量。併發數量過多,可能會導致資源消耗過多,從而造成服務器崩潰。(主要原因)。 可以對線程做統一管理。 線程池的原理 Java中的線程