最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中通用工具類(lèi)庫(kù)(Utils)封裝與使用實(shí)踐

 更新時(shí)間:2026年07月26日 13:38:10   作者:霸道流氓氣質(zhì)  
還在為Java中繁瑣的空值判斷和日期處理頭疼嗎,這篇工具類(lèi)庫(kù)總結(jié)涵蓋了空值判斷、日期處理、JSON序列化、加密工具等常用功能,提供統(tǒng)一判空、智能日期解析和JSON容錯(cuò)處理,讓你的代碼更簡(jiǎn)潔健壯

一、涉及的技術(shù)知識(shí)點(diǎn)

1.1 空值判斷與防御性編程

知識(shí)點(diǎn)說(shuō)明
多類(lèi)型空值判斷對(duì) String/Collection/Map/Array/Optional/Object 統(tǒng)一判空
可變參數(shù)(varargs)isOrEmpty(Object...) 任一為空返回 true,isAndEmpty(Object...) 全部為空返回 true
Null Safety替代手寫(xiě) != null && !"" 鏈?zhǔn)脚袛?/td>

1.2 日期時(shí)間處理

知識(shí)點(diǎn)說(shuō)明
java.util.Date(舊 API)DateUtil 基于舊 API 兼容存量代碼
java.time.LocalDate/LocalDateTime(新 API)DateTimeUtil 基于 Java 8 時(shí)間 API
智能日期解析根據(jù)字符串長(zhǎng)度自動(dòng)識(shí)別格式(10位時(shí)間戳/13位時(shí)間戳/19位標(biāo)準(zhǔn)格式/23位含毫秒)
正則模式匹配用正則判斷日期字符串格式(標(biāo)準(zhǔn) yyyy-MM-dd/斜杠 yyyy/MM/dd
TemporalAdjusters獲取月初/月末/年初/年末/上月/下月等時(shí)間點(diǎn)
時(shí)區(qū)枚舉ZoneEnums 定義時(shí)區(qū)常量
日期格式枚舉DateTimeFormat 枚舉統(tǒng)一管理 20+ 種日期格式

1.3 JSON 序列化/反序列化

知識(shí)點(diǎn)說(shuō)明
Jackson ObjectMapper配置好的全局單例,線程安全
TypeReference 泛型反序列化解決 Java 泛型擦除問(wèn)題
Snake Case 支持snakeMapper 自動(dòng)駝峰 ↔ 下劃線轉(zhuǎn)換
容錯(cuò)處理序列化/反序列化異常不拋出,返回 null 并記錄日志

1.4 加密工具

知識(shí)點(diǎn)說(shuō)明
AES 對(duì)稱(chēng)加密AesUtil 提供簡(jiǎn)單的 AES 加解密(ECB 模式)
MD5 摘要Md5Utils 提供 MD5 哈希(簽名校驗(yàn)場(chǎng)景)
ThreadLocal MessageDigestMD5 計(jì)算使用 ThreadLocal 避免多線程競(jìng)爭(zhēng)
Hex 編碼字節(jié)數(shù)組轉(zhuǎn)十六進(jìn)制字符串

1.5 線程上下文管理

知識(shí)點(diǎn)說(shuō)明
ThreadLocalAuth2SessionIdUtil 使用 ThreadLocal 存儲(chǔ)請(qǐng)求級(jí)別的用戶(hù)信息
Token 傳遞在請(qǐng)求處理鏈中透?jìng)?OAuth2 Token
請(qǐng)求級(jí)隔離每個(gè)請(qǐng)求有獨(dú)立的 sessionId/token/loginName
清理機(jī)制delete() 方法清理 ThreadLocal 防止內(nèi)存泄漏

1.6 國(guó)際化(i18n)

知識(shí)點(diǎn)說(shuō)明
MessageSourceSpring 國(guó)際化消息源
資源文件messages.properties / messages_zh_CN.properties
參數(shù)化消息getMsg(key, args...) 支持占位符

1.7 網(wǎng)絡(luò)工具

知識(shí)點(diǎn)說(shuō)明
客戶(hù)端 IP 獲取X-Forwarded-For / X-Real-IP 等 Header 解析
內(nèi)網(wǎng) IP 判斷isIntranetIp() 判斷是否為 10.x/172.16-31.x/192.168.x
主機(jī)名獲取getHostName() 獲取當(dāng)前服務(wù)器主機(jī)名
ThreadLocal IP請(qǐng)求級(jí)別緩存客戶(hù)端 IP

二、包結(jié)構(gòu)

xxx.xxx.xxx.utils
├── CheckEmptyUtil.java          // 空值判斷工具(使用頻率最高)
├── DateUtil.java                // 日期工具(舊API,java.util.Date)
├── StringUtil.java              // 字符串/JSON工具(序列化+特殊字符處理)
├── JsonUtil.java                // JSON 序列化工具(支持 Snake Case)
├── Auth2SessionIdUtil.java      // OAuth2 會(huì)話(huà)上下文(ThreadLocal)
├── IpUtil.java                  // IP 地址工具
├── AesUtil.java                 // AES 加解密工具
├── Md5Utils.java                // MD5 摘要工具
├── xxxI18nUtil.java             // 國(guó)際化消息工具
├── FileUtil.java                // 文件操作工具
├── JasperUtil.java              // 報(bào)表導(dǎo)出工具(Jasper)
├── PdfUtil.java                 // PDF 生成工具
├── ClassNameUtil.java           // 類(lèi)名處理工具
├── xxxSerializationUtils.java   // Java 序列化工具
├── PackageUtil.java             // 包掃描工具
├── UrlUtil.java                 // URL 處理工具
├── cloud/
│   ├── AdapterHeader.java       // 適配器 Header 工具
│   └── LoginToken.java          // 登錄 Token 封裝
└── time/
    ├── DateTimeUtil.java        // 日期時(shí)間工具(新API,java.time)
    ├── DateTimeFormat.java      // 日期格式枚舉(20+種預(yù)定義格式)
    ├── DateTimeConverter.java   // 日期轉(zhuǎn)換器
    └── ZoneEnums.java           // 時(shí)區(qū)枚舉

無(wú) spring.factories:純工具類(lèi)庫(kù),不涉及自動(dòng)配置,直接引入靜態(tài)方法調(diào)用。

三、通用示例代碼

3.1 CheckEmptyUtil(空值判斷工具)

package com.example.utils;

import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;

/**
 * 通用空值判斷工具.
 * 統(tǒng)一處理各種類(lèi)型的空值判斷,替代業(yè)務(wù)代碼中的 != null && !isEmpty() 鏈?zhǔn)脚袛?
 * 
 * 支持類(lèi)型:
 * - null
 * - String(空字符串)
 * - Collection(空集合)
 * - Map(空Map)
 * - Array(空數(shù)組)
 * - Optional(空Optional)
 * - 其他 Object(僅判null)
 */
public class CheckEmptyUtil {

    /**
     * 判斷對(duì)象是否為空.
     * 根據(jù)實(shí)際類(lèi)型自動(dòng)選擇判空策略.
     */
    public static boolean isEmpty(Object obj) {
        if (obj == null) {
            return true;
        }
        if (obj instanceof String) {
            return ((String) obj).trim().isEmpty();
        }
        if (obj instanceof Collection) {
            return ((Collection<?>) obj).isEmpty();
        }
        if (obj instanceof Map) {
            return ((Map<?, ?>) obj).isEmpty();
        }
        if (obj.getClass().isArray()) {
            return Array.getLength(obj) == 0;
        }
        if (obj instanceof Optional) {
            return !((Optional<?>) obj).isPresent();
        }
        return false;
    }

    /**
     * 判斷對(duì)象是否非空.
     */
    public static boolean isNotEmpty(Object obj) {
        return !isEmpty(obj);
    }

    /**
     * 任一參數(shù)為空返回true.
     * 常用于參數(shù)校驗(yàn):if (isOrEmpty(a, b)) throw ...
     */
    public static boolean isOrEmpty(Object... objs) {
        if (objs == null) {
            return true;
        }
        for (Object obj : objs) {
            if (isEmpty(obj)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 全部參數(shù)都為空返回true.
     * 常用于條件判斷:if (isAndEmpty(a, b)) 都沒(méi)傳
     */
    public static boolean isAndEmpty(Object... objs) {
        if (objs == null) {
            return true;
        }
        for (Object obj : objs) {
            if (isNotEmpty(obj)) {
                return false;
            }
        }
        return true;
    }
}

3.2 DateUtil(舊版日期工具)

package com.example.utils;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Pattern;

/**
 * 日期工具類(lèi)(基于 java.util.Date).
 * 
 * 核心特性:
 * 1. 智能日期解析 - 根據(jù)字符串格式自動(dòng)識(shí)別
 * 2. 常用日期操作 - 月初/月末/日始/日終
 * 3. 日期格式化 - 標(biāo)準(zhǔn)格式輸出
 */
public class DateUtil {

    private static final Pattern UNIX_TIMESTAMP = Pattern.compile("^\\d{10}$");
    private static final Pattern JAVA_TIMESTAMP = Pattern.compile("^\\d{13}$");
    private static final String STANDARD_DATETIME = "yyyy-MM-dd HH:mm:ss";
    private static final String STANDARD_DATE = "yyyy-MM-dd";

    /**
     * 智能日期解析.
     * 支持:時(shí)間戳(10位/13位)、標(biāo)準(zhǔn)格式、斜杠格式.
     * 
     * @param text 日期字符串
     * @return Date 對(duì)象,解析失敗返回 null
     */
    public static Date convertToDate(String text) {
        if (text == null || text.trim().isEmpty()) {
            return null;
        }
        text = text.trim();
        try {
            switch (text.length()) {
                case 10:
                    // Unix 時(shí)間戳 或 yyyy-MM-dd
                    if (UNIX_TIMESTAMP.matcher(text).matches()) {
                        return new Date(Long.parseLong(text) * 1000);
                    }
                    return new SimpleDateFormat(STANDARD_DATE).parse(text);
                case 13:
                    // Java 時(shí)間戳
                    if (JAVA_TIMESTAMP.matcher(text).matches()) {
                        return new Date(Long.parseLong(text));
                    }
                    return null;
                case 19:
                    // yyyy-MM-dd HH:mm:ss
                    return new SimpleDateFormat(STANDARD_DATETIME).parse(text);
                case 23:
                    // yyyy-MM-dd HH:mm:ss.SSS
                    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse(text);
                default:
                    return new SimpleDateFormat(STANDARD_DATETIME).parse(text);
            }
        } catch (Exception e) {
            return null;
        }
    }

    /** 獲取日期的起始時(shí)刻(00:00:00.000). */
    public static Date getDayBegin(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return cal.getTime();
    }

    /** 獲取日期的結(jié)束時(shí)刻(23:59:59.999). */
    public static Date getDayEnd(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(Calendar.HOUR_OF_DAY, 23);
        cal.set(Calendar.MINUTE, 59);
        cal.set(Calendar.SECOND, 59);
        cal.set(Calendar.MILLISECOND, 999);
        return cal.getTime();
    }

    /** 格式化為標(biāo)準(zhǔn)日期時(shí)間字符串. */
    public static String formatStandardDateTime(Date date) {
        if (date == null) return null;
        return new SimpleDateFormat(STANDARD_DATETIME).format(date);
    }

    /** 獲取 N 天后的日期. */
    public static Date getDateAfter(Date date, int days) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DAY_OF_MONTH, days);
        return cal.getTime();
    }
}

3.3 StringUtil(字符串/JSON 工具)

package com.example.utils;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.util.regex.Pattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 字符串和JSON工具類(lèi).
 * 
 * 核心功能:
 * 1. JSON 序列化/反序列化(容錯(cuò)模式)
 * 2. 特殊字符檢測(cè)和替換(中文/Emoji/符號(hào))
 * 3. 駝峰拆分
 */
public class StringUtil {

    private static final Logger logger = LoggerFactory.getLogger(StringUtil.class);
    private static final Pattern CHINESE_CHAR = Pattern.compile("[\\u4e00-\\u9fa5]");
    private static final Pattern EMOJI_CHAR = Pattern.compile("[\\ud800-\\udfff]");

    // 全局單例 ObjectMapper(線程安全)
    private static final ObjectMapper READ_MAPPER = new ObjectMapper()
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    private static final ObjectMapper WRITE_MAPPER = new ObjectMapper()
        .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

    /**
     * 對(duì)象序列化為 JSON 字符串.
     * 異常時(shí)返回空字符串,不拋出異常.
     */
    public static String getJsonString(Object obj) {
        if (obj == null) {
            return "";
        }
        if (obj instanceof String) {
            return (String) obj;
        }
        try {
            return WRITE_MAPPER.writeValueAsString(obj);
        } catch (Exception e) {
            logger.error("JSON序列化失敗", e);
            return "";
        }
    }

    /**
     * JSON 字符串反序列化為對(duì)象.
     */
    public static <T> T parseJsonString(String json, Class<T> clazz) {
        if (json == null || json.isEmpty()) {
            return null;
        }
        try {
            return READ_MAPPER.readValue(json, clazz);
        } catch (Exception e) {
            logger.error("JSON反序列化失敗", e);
            return null;
        }
    }

    /**
     * JSON 字符串反序列化(泛型支持).
     */
    public static <T> T parseJsonString(String json, TypeReference<T> typeRef) {
        if (json == null || json.isEmpty()) {
            return null;
        }
        try {
            return READ_MAPPER.readValue(json, typeRef);
        } catch (Exception e) {
            logger.error("JSON反序列化失敗", e);
            return null;
        }
    }

    /** 是否包含中文字符. */
    public static boolean containsChinese(String str) {
        return str != null && CHINESE_CHAR.matcher(str).find();
    }

    /** 是否包含 Emoji 字符. */
    public static boolean containsEmoji(String str) {
        return str != null && EMOJI_CHAR.matcher(str).find();
    }

    /** 替換 Emoji 為指定字符. */
    public static String replaceEmoji(String str, String replacement) {
        if (str == null) return null;
        return EMOJI_CHAR.matcher(str).replaceAll(replacement);
    }
}

3.4 Auth2SessionIdUtil(請(qǐng)求上下文工具)

package com.example.utils;

/**
 * OAuth2 請(qǐng)求級(jí)別上下文工具.
 * 通過(guò) ThreadLocal 存儲(chǔ)當(dāng)前請(qǐng)求的用戶(hù)信息,在同一請(qǐng)求內(nèi)全局可訪問(wèn).
 * 
 * 使用場(chǎng)景:
 * - Filter/Interceptor 中設(shè)置(請(qǐng)求進(jìn)入時(shí))
 * - Service 層中讀取(業(yè)務(wù)處理時(shí))
 * - Filter 中清理(請(qǐng)求結(jié)束時(shí))
 * 
 * 注意:必須在請(qǐng)求結(jié)束時(shí)調(diào)用 delete() 清理,防止線程池復(fù)用導(dǎo)致數(shù)據(jù)串線.
 */
public final class Auth2SessionIdUtil {

    private static final ThreadLocal<String> sessionIdLocal = new ThreadLocal<>();
    private static final ThreadLocal<String> tokenLocal = new ThreadLocal<>();
    private static final ThreadLocal<String> loginNameLocal = new ThreadLocal<>();

    /** 獲取當(dāng)前請(qǐng)求的會(huì)話(huà)ID. */
    public static String getSessionId() {
        return sessionIdLocal.get();
    }

    public static void setSessionId(String sessionId) {
        sessionIdLocal.set(sessionId);
    }

    /** 獲取當(dāng)前請(qǐng)求的 OAuth2 Token. */
    public static String getToken() {
        return tokenLocal.get();
    }

    public static void setToken(String token) {
        tokenLocal.set(token);
    }

    /** 獲取當(dāng)前登錄用戶(hù)名. */
    public static String getLoginName() {
        return loginNameLocal.get();
    }

    public static void setLoginName(String loginName) {
        loginNameLocal.set(loginName);
    }

    /**
     * 清理所有 ThreadLocal 數(shù)據(jù).
     * 必須在請(qǐng)求結(jié)束時(shí)調(diào)用!防止線程池復(fù)用導(dǎo)致數(shù)據(jù)泄露.
     */
    public static void delete() {
        sessionIdLocal.remove();
        tokenLocal.remove();
        loginNameLocal.remove();
    }
}

3.5 pom.xml(工具庫(kù))

<project>
    <groupId>com.example</groupId>
    <artifactId>example-utils</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    <dependencies>
        <!-- JSON -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <scope>provided</scope>
        </dependency>
        <!-- Servlet(獲取IP等) -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>
        <!-- Spring Context(國(guó)際化) -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <scope>provided</scope>
        </dependency>
        <!-- 日志 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>

四、引入方使用

4.1 添加依賴(lài)

<dependency>
    <groupId>com.example</groupId>
    <artifactId>example-utils</artifactId>
    <version>1.0.0</version>
</dependency>

4.2 使用示例

@Service
public class OrderService {

    public void processOrder(OrderDto dto) {
        // 參數(shù)校驗(yàn)
        if (CheckEmptyUtil.isOrEmpty(dto.getOrderCode(), dto.getMemberId())) {
            throw new IllegalArgumentException("參數(shù)不能為空");
        }

        // 日期處理
        Date deliveryDate = DateUtil.convertToDate(dto.getDeliveryTime());  // 自動(dòng)識(shí)別格式
        Date deadline = DateUtil.getDateAfter(deliveryDate, 3);            // 3天后

        // JSON 序列化(記日志)
        log.info("處理訂單入?yún)? {}", StringUtil.getJsonString(dto));

        // 空值安全操作
        if (CheckEmptyUtil.isNotEmpty(dto.getItemList())) {
            dto.getItemList().forEach(item -> {
                // 業(yè)務(wù)邏輯...
            });
        }
    }
}

五、關(guān)鍵設(shè)計(jì)總結(jié)

設(shè)計(jì)要點(diǎn)實(shí)現(xiàn)方式收益
多類(lèi)型統(tǒng)一判空instanceof 分發(fā)一個(gè)方法覆蓋所有類(lèi)型,減少重復(fù)代碼
智能日期解析按字符串長(zhǎng)度 + 正則分發(fā)無(wú)需調(diào)用方關(guān)心日期格式
JSON 容錯(cuò)序列化/反序列化異常返回 null不會(huì)因?yàn)橐粋€(gè)字段異常導(dǎo)致整個(gè)請(qǐng)求失敗
全局 ObjectMapper靜態(tài)單例 + 線程安全配置避免每次創(chuàng)建實(shí)例的開(kāi)銷(xiāo)
ThreadLocal 上下文請(qǐng)求級(jí)隔離用戶(hù)信息Service 層無(wú)需傳參即可獲取當(dāng)前用戶(hù)
ThreadLocal 清理delete() 方法防止線程池復(fù)用導(dǎo)致數(shù)據(jù)串線
純靜態(tài)工具類(lèi)無(wú) spring.factories,無(wú) Bean 注冊(cè)任何項(xiàng)目引入即用,零配置
provided scope核心依賴(lài)由引入方提供不引入版本沖突

以上就是SpringBoot中通用工具類(lèi)庫(kù)(Utils)封裝與使用實(shí)踐的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot通用工具類(lèi)庫(kù)封裝與使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java javax.annotation.Resource注解的詳解

    java javax.annotation.Resource注解的詳解

    這篇文章主要介紹了javax.annotation.Resource注解的詳解的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • 一文帶你了解Spring中@Enable開(kāi)頭注解的使用

    一文帶你了解Spring中@Enable開(kāi)頭注解的使用

    前面的文章給大家介紹?Spring?的重試機(jī)制的時(shí)候有提到過(guò)?Spring?有很多?@Enable?開(kāi)頭的注解,平時(shí)在使用的時(shí)候也沒(méi)有注意過(guò)為什么會(huì)有這些注解,今天就給大家介紹一下
    2022-09-09
  • Springboot非分布式定時(shí)任務(wù)實(shí)現(xiàn)代碼

    Springboot非分布式定時(shí)任務(wù)實(shí)現(xiàn)代碼

    這篇文章主要介紹了Springboot非分布式定時(shí)任務(wù)實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • feign遠(yuǎn)程調(diào)用無(wú)法傳遞對(duì)象屬性405的問(wèn)題

    feign遠(yuǎn)程調(diào)用無(wú)法傳遞對(duì)象屬性405的問(wèn)題

    這篇文章主要介紹了feign遠(yuǎn)程調(diào)用無(wú)法傳遞對(duì)象屬性405的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java修改Integer變量值遇到的問(wèn)題及解決

    Java修改Integer變量值遇到的問(wèn)題及解決

    這篇文章主要介紹了Java修改Integer變量值遇到的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java中字符串和byte數(shù)組之間的簡(jiǎn)單轉(zhuǎn)換方法

    Java中字符串和byte數(shù)組之間的簡(jiǎn)單轉(zhuǎn)換方法

    這篇文章主要給大家介紹了關(guān)于Java中字符串和byte數(shù)組之間的簡(jiǎn)單轉(zhuǎn)換方法,Java中將String類(lèi)型轉(zhuǎn)換為byte[]類(lèi)型,可以使用String的getBytes()方法,還有很多其他的辦法,需要的朋友可以參考下
    2023-08-08
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(59)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(59)

    下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你
    2021-08-08
  • Java并發(fā)編程volatile關(guān)鍵字的作用

    Java并發(fā)編程volatile關(guān)鍵字的作用

    這篇文章主要介紹了Java并發(fā)編程volatile關(guān)鍵字的作用,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 你可知HashMap為什么是線程不安全的

    你可知HashMap為什么是線程不安全的

    這篇文章主要介紹了你可知HashMap為什么是線程不安全的,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Java current并發(fā)包超詳細(xì)分析

    Java current并發(fā)包超詳細(xì)分析

    current并發(fā)包、在JDK1.5之前Java并沒(méi)有提供線程安全的一些工具類(lèi)去操作多線程,需要開(kāi)發(fā)人員自行編寫(xiě)實(shí)現(xiàn)線程安全,但仍然無(wú)法完全避免低性能、死鎖、資源管理等問(wèn)題。在JDK1.5時(shí)新增了java.util.current并發(fā)包,其中提供了許多供我們使用的并發(fā)編程工具類(lèi)
    2023-02-02

最新評(píng)論

青海省| 高雄县| 昌黎县| 淮安市| 科尔| 常熟市| 拜城县| 高淳县| 比如县| 武乡县| 炎陵县| 贵州省| 宝坻区| 北碚区| 盐池县| 昭苏县| 新野县| 汶上县| 吉安市| 连南| 格尔木市| 东光县| 沈阳市| 明水县| 右玉县| 安丘市| 讷河市| 河东区| 岑巩县| 宜黄县| 利川市| 日照市| 黑水县| 尤溪县| 河东区| 乐平市| 石景山区| 潜山县| 延庆县| 永定县| 秦皇岛市|