原创 《Java併發編程的藝術》筆記五——Java線程基礎.md

0.線程的狀態 名稱 說明 New 即線程剛剛創建,而並未執行 Runnable 運行狀態,Java線程將操作系統中的就緒和運行兩種狀態籠統的稱作“運行中” Blocked 阻塞狀態,表示線程阻塞於鎖 Waitin

原创 【併發編程系列】1.併發安全問題的源頭

【併發編程系列】是整理自極客時間上王寶令老師的專欄:《Java併發編程實戰》。 如有侵權,請告知。 0.定義 可見性: 一個線程對共享變量的修改,另一個線程能夠立刻看到。 原子性: 一個或多個操作在CPU執行過程中不被中斷,稱爲原

原创 《JVM學習系列》四.垃圾收集算法及HotSpot的算法實現

0 說明 本篇文章只是介紹幾種算法的思想,實現細節不會過多的討論。 1.垃圾收集算法 1.1標記-清除算法 算法分爲標記和清除兩個階段:首先標記出所有需要回收的對象,在標記完成後統一回收所有被標記的對象,它的標記過程就是使用可達

原创 【同步-專欄系列】2.利用互斥鎖解決原子性問題

原子性的定義:一個或多個操作在CPU的執行過程中,不被中斷的特性叫做原子性。 我們知道引起原子性問題的原因是“線程切換”。所以如果能夠禁止線程切換就解決問題了?而操作系統是依賴CPU中斷做線程切換的,那麼我們禁用CPU中斷不就行了嗎?

原创 Volatile和“Happens-Before”原則.md

volatile不是Java獨有的,C語言也有,它的直接目的就是禁用CPU緩存。 使用volatile修飾的變量,它實現的作用是,對於這個變量的讀寫,不能使用CPU緩存必須從內存中寫入或讀出。 看一個例子,線程A執行writer方法,

原创 Redis底層數據結構.md

1.Redis 概述 Redis 數據庫裏面的每個鍵值對(key-value) 都是由對象(object)組成的: 數據庫鍵總是一個字符串對象(string object); 數據庫的值則可以是字符串對象、列表對象(list)、哈希對

原创 併發安全問題的源頭

0.定義 可見性: 一個線程對共享變量的修改,另一個線程能夠立刻看到。 原子性: 一個或多個操作在CPU執行過程中不被中斷,稱爲原子性。 有序性: 程序按照代碼的先後順序執行。 導致可見性問題的原因是CPU緩存; 導致有序性問題的原

原创 volatile的適用場景.md

一般多線程問題涉及到兩個特性:原子性和可見性。 關鍵字synchronized舉例,如果把代碼塊聲明爲 synchronized,有兩個重要後果,通常是指該代碼具有 原子性(atomicity)和 可見性(visibility)。 原

原创 Java 線程池的submit的使用與分析.md

在Java5以後,通過Executor來啓動線程比用Thread的start()更好。在新特徵中,可以很容易控制線程的啓動、執行和關閉過程,還可以很容易使用線程池的特性。我們用的最多的execute方法, 0.異步返回值的場景 我們先

原创 如何實現自定義註解.md

如果用最簡單的話描述註解,那就是元數據,即一種描述數據的數據。所以,可以說註解就是源代碼的元數據。 在Java中叫Annotation,Annotation是一種應用於類、方法、參數、變量、構造器及包聲明中的特殊修飾符。 Java自帶

原创 MongoRepository的findById方法查不出_id值的解決方案.md

搭一個新項目,從mongo數據庫中查詢數據,我直接使用的spring-data-mongodb模塊。直接創建Repository接口,繼承MongoRepository public interface ResourceReposit

原创 Java線程池的典型用法.md

Java中線程的出現通常是實現異步處理的功能,我們創建和使用一個線程非常簡單,但是有一個問題: 如果併發的線程數量很多,並且每個線程都是執行一個時間很短的任務就結束了,這樣頻繁創建線程就會大大降低系統的效率,因爲頻繁創建線程和銷燬線程

原创 token保活設計.md

如果我們要使用token機制用以標識用戶登錄狀態,以獲得請求相關資源接口的權限。讓你來設計一套方案,以爲怎麼設計呢? 通常有兩種思路: 1.使用refreshtoken獲取新的accesstoken 登錄成功之後,返回一個返回refr

原创 SpringBoot中使用websocket.md

最近有這樣一個需求,網關廠家將物聯設備接入我司雲平臺的時候,希望能看到上報設備數據的關鍵日誌,以方便調試。 首先想到的就是使用websocket推送。瀏覽器發起websocket連接,發送訂閱消息,然後往這個連接session中推送日

原创 Spring中手動開啓kafka監聽.md

0. 背景重現 最近搭建一個新項目,基於SpringBoot框架,使用Kafka做消息中間件。 使用@KafkaListener註解來創建一個消費者,實現對Kafka消息的消費。我計劃的執行順序是這樣的:服務啓動之後,創建Consum