原创 Java 開發四張技術棧圖

1、分佈式專題2、高併發/高性能3、性能優化專題4、源碼分析專題

原创 編寫一個初始化之後,不可修改的集合(比如:Map、List、Set等不可變對象)

Java中提供final關鍵字,對基本類型進行修飾,當第一次初始化後,該變量就不可被修改,比如:private final int a = 123;然而,對於Map等類型,我們只能對於其引用不能被再次初始化,而其中的值則可以變化,比如:p

原创 單例模式討論

在之前的博文中曾經介紹過單例模式:https://blog.csdn.net/timchen525/article/details/78244101這裏重新討論們下單例模式,並且引入了一個基於枚舉的單例模式。分析如下代碼:** * 懶漢

原创 線程安全性-有序性

有序性:Java內存模型中,允許編譯器和處理器對指令進行重排序,但是重排序過程不會影響到單線程程序的運行,卻會影響到多線程併發執行的正確性。Java中保證有序性:volatile、synchronized、Lock有序性-happens-

原创 共享變量在線程中的可見性問題分析

導致共享變量在線程間不可見的原因: 1)線程交叉執行 2)重排序結合線程交叉執行 3)共享變量更新後的值沒有在工作內存與主存間及時更新   可見性-synchronized JVM中關於synchronized的兩條規定: 1)線程解鎖前

原创 原子性-synchronized 修飾的四種方式

原子性-synchronized(依賴JVM)1)修飾代碼塊:大括號括起來的代碼,作用於調用的對象比如:public void test1(int j) { synchronized (this) { // 作用的範圍是大括號括

原创 idea中maven依賴包識別不了的問題

項目開發過程中遇到依賴的jar包無法識別到,可以通過查看idea的help=>“Show log in finder” 解決上面問題,只要刪除掉本地的maven倉庫相關的jar包即可。

原创 寫一個併發計數器

首先給出一個併發場景下,錯誤的計數器方法:public class CountExample { // 請求總數 public static int clientTotal = 5000; // 同時併發執行的線程

原创 寫一個併發編程的代碼,保證該代碼只能執行一次

錯誤的例子:@ThreadSafe @Slf4j public class AtomicExample6 { // 總的請求個數 public static final int requestTotal = 1000;

原创 volatile具體使用場景

volatile特別適合於狀態標記量舉個栗子:volatile boolean inited = false; // 線程1 context = loadContext(); inited = true; // 線程2 while(!

原创 ThreadLocal在實際項目中的應用

首先,分析下ThreadLocal的源碼:在分析ThreadLocal的具體用法前,我們來看下ThreadLocal對外提供的三個方法(set、get、delete)的源碼:1)set方法 設置變量public void set(T va

原创 Java 內存模型-同步八種操作

(1)lock(鎖定):作用於主內存的變量,把一個變量標記爲一條線程獨佔狀態(2)unlock(解鎖):作用於主內存的變量,把一個處於鎖定狀態的變量釋放出來,釋放後的變量纔可以被其他線程鎖定(3)read(讀取):作用於主內存的變量,把一

原创 關於log該如何打以便後期排查問題

以前打印log前,沒有考慮之後排查問題的方便與否,而只是覺得重要的信息纔打印,但是什麼是重要信息呢?這裏總結了以下幾點經驗:1、通過打印log來跟蹤一組行爲在前面的博文:https://blog.csdn.net/timchen525/a

原创 利用Swagger2 構建api文檔

背景介紹: Swagger是一個用於java代碼中寫註解,然後可以通過訪問指定的網頁,自動生成接口文檔,並且可以通過接口進行功能測試。 使用介紹: (1)添加Maven依賴 <dependency> <groupId>io.spring

原创 Java 動態代理

Java動態代理的實現有兩種方式: 1、jdk 自帶的動態代理 2、spring 中的cglib實現的動態代理 區別: jdk自帶的動態代理一定要有接口interface類,而cglib不需要。 (1)基本信息 UserInfoServ