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

Java的對(duì)象頭原理與源碼超詳細(xì)講解

 更新時(shí)間:2025年08月06日 09:54:24   作者:goTsHgo  
Java對(duì)象頭是對(duì)象內(nèi)存布局的核心部分,存儲(chǔ)元數(shù)據(jù)和運(yùn)行時(shí)狀態(tài),這篇文章主要介紹了Java的對(duì)象頭原理與源碼超詳細(xì)講解的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

本文將從底層原理和源代碼層面詳細(xì)解釋Java的對(duì)象頭(Object Header),并且盡量用通俗易懂的語(yǔ)言讓初學(xué)者也能理解。首先從概念開(kāi)始,逐步深入到實(shí)現(xiàn)細(xì)節(jié),涵蓋對(duì)象頭的結(jié)構(gòu)、作用、源碼分析,并提供完整的步驟和推導(dǎo)。內(nèi)容清晰、結(jié)構(gòu)化,避免過(guò)于晦澀的技術(shù)術(shù)語(yǔ)。由于對(duì)象頭是Java鎖機(jī)制(如synchronized)的基礎(chǔ),我會(huì)適當(dāng)結(jié)合鎖的場(chǎng)景來(lái)增強(qiáng)理解。

一、什么是Java對(duì)象頭?為什么需要它?

1.1 對(duì)象頭的概念

 在Java中,每個(gè)對(duì)象(比如new Object()創(chuàng)建的對(duì)象)在內(nèi)存中不僅存儲(chǔ)了它的實(shí)際數(shù)據(jù)(字段值),還有一個(gè)額外的“標(biāo)簽”部分,稱為對(duì)象頭(Object Header)。你可以把對(duì)象頭想象成一個(gè)身份證,記錄了對(duì)象的身份信息和狀態(tài),比如:

  • 這個(gè)對(duì)象是否被鎖???
  • 這個(gè)對(duì)象屬于哪個(gè)類?
  • 這個(gè)對(duì)象的年齡(用于垃圾回收)?

對(duì)象頭就像一個(gè)“管理面板”,JVM(Java虛擬機(jī))通過(guò)它來(lái)管理對(duì)象的生命周期、鎖狀態(tài)和內(nèi)存分配。

1.2 為什么需要對(duì)象頭?

對(duì)象頭的主要作用是為JVM提供元數(shù)據(jù)(Metadata),支持以下功能:

  1. 鎖機(jī)制:實(shí)現(xiàn)synchronized鎖,記錄鎖狀態(tài)(比如哪個(gè)線程持有鎖)。
  2. 垃圾回收:記錄對(duì)象的分代年齡(GC Age),決定對(duì)象是否需要被回收。
  3. 類型信息:指向?qū)ο蟮念愋畔?,確保JVM知道這個(gè)對(duì)象是哪個(gè)類的實(shí)例。
  4. 哈希碼:存儲(chǔ)對(duì)象的hashCode()值,用于HashMap等數(shù)據(jù)結(jié)構(gòu)。
  5. 數(shù)組支持:如果對(duì)象是數(shù)組,記錄數(shù)組長(zhǎng)度。

沒(méi)有對(duì)象頭,JVM就無(wú)法高效管理對(duì)象,也無(wú)法實(shí)現(xiàn)多線程的線程安全。

二、Java對(duì)象頭的結(jié)構(gòu)

Java對(duì)象頭的結(jié)構(gòu)在JVM實(shí)現(xiàn)中(以HotSpot JVM為主)分為幾個(gè)部分,主要包括:

  1. Mark Word:動(dòng)態(tài)變化的部分,存儲(chǔ)鎖狀態(tài)、哈希碼、分代年齡等。
  2. Class Metadata Address:指向?qū)ο笏鶎兕惖脑獢?shù)據(jù)地址。
  3. Array Length(可選):如果對(duì)象是數(shù)組,存儲(chǔ)數(shù)組長(zhǎng)度。

以下是對(duì)象頭在內(nèi)存中的典型布局(以64位JVM為例,假設(shè)未開(kāi)啟指針壓縮):

部分大小(64位JVM)描述
Mark Word8字節(jié)(64位)鎖狀態(tài)、哈希碼、GC年齡等
Class Metadata Address8字節(jié)(64位)指向類的元數(shù)據(jù)地址
Array Length4字節(jié)(可選)數(shù)組長(zhǎng)度(僅數(shù)組對(duì)象有)

2.1 Mark Word

Mark Word 是對(duì)象頭中最復(fù)雜、最動(dòng)態(tài)的部分。它的內(nèi)容會(huì)根據(jù)對(duì)象狀態(tài)(無(wú)鎖、鎖住、GC標(biāo)記等)變化。Mark Word 通常包含以下信息:

  • 鎖狀態(tài):無(wú)鎖、偏向鎖、輕量級(jí)鎖、重量級(jí)鎖。
  • 線程ID:持有鎖的線程ID(偏向鎖時(shí))。
  • 哈希碼:對(duì)象的hashCode()值。
  • 分代年齡:用于垃圾回收,記錄對(duì)象經(jīng)歷的GC次數(shù)。
  • 鎖記錄指針:輕量級(jí)鎖或重量級(jí)鎖時(shí),指向鎖記錄或Monitor。

Mark Word 的結(jié)構(gòu)會(huì)根據(jù)鎖狀態(tài)動(dòng)態(tài)調(diào)整。例如,在無(wú)鎖狀態(tài)下,它會(huì)存儲(chǔ)哈希碼和GC年齡;在鎖住狀態(tài)下,它會(huì)存儲(chǔ)線程ID或Monitor指針。

以下是 Mark Word 在不同狀態(tài)下的典型布局(64位JVM,未壓縮指針):

鎖狀態(tài)63-56bit55-2bit1-0bit(鎖標(biāo)志)
無(wú)鎖GC年齡對(duì)象的哈希碼01
偏向鎖線程IDEpoch01
輕量級(jí)鎖指向鎖記錄的指針00
重量級(jí)鎖指向Monitor的指針10
GC標(biāo)記GC相關(guān)信息11

完整位劃分

狀態(tài)位范圍字段名大小(位)說(shuō)明
無(wú)鎖63-31未使用33保留位,通常為 0,未來(lái)可能擴(kuò)展使用。
30-8哈希碼 (hash)23對(duì)象的 hashCode() 值,調(diào)用 System.identityHashCode() 時(shí)生成。
7-4分代年齡 (age)4垃圾回收年齡,記錄對(duì)象經(jīng)歷的 Minor GC 次數(shù)(最大 15)。
3-2未使用2保留位,通常為 0。
1-0鎖標(biāo)志位201,表示無(wú)鎖狀態(tài)。
偏向鎖63-56未使用8保留位,通常為 0。
55-8線程 ID48持有偏向鎖的線程 ID,標(biāo)識(shí)哪個(gè)線程“偏向”這個(gè)對(duì)象。
7-6Epoch2偏向鎖的時(shí)間戳,用于批量撤銷偏向鎖(優(yōu)化機(jī)制)。
5-4分代年齡 (age)4同無(wú)鎖狀態(tài),記錄 GC 年齡。
3偏向鎖標(biāo)志11,表示是偏向鎖(與無(wú)鎖區(qū)分)。
2-1未使用2保留位,通常為 0。
0鎖標(biāo)志位11,與偏向鎖標(biāo)志一起組成 01(最低 2 位)。
輕量級(jí)鎖63-2鎖記錄指針62指向線程棧中的鎖記錄(Displaced Header),保存原來(lái)的 Mark Word。
1-0鎖標(biāo)志位200,表示輕量級(jí)鎖狀態(tài)。
重量級(jí)鎖63-2Monitor 指針62指向 ObjectMonitor 實(shí)例(操作系統(tǒng)級(jí)互斥鎖)。
1-0鎖標(biāo)志位210,表示重量級(jí)鎖狀態(tài)。
GC 標(biāo)記63-2GC 相關(guān)信息62存儲(chǔ)垃圾回收標(biāo)記信息(如對(duì)象是否存活,具體由 GC 算法決定)。
1-0鎖標(biāo)志位211,表示 GC 標(biāo)記狀態(tài)。

32位JVM中是這么存的:

鎖狀態(tài)

25bit

4bit

1bit

2bit

23bit

2bit

是否偏向鎖

鎖標(biāo)志位

無(wú)鎖

對(duì)象的哈希碼

分代年齡

0

01

偏向鎖

線程ID

Epoch

分代年齡

1

01

輕量級(jí)鎖

指向棧中鎖記錄的指針

00

重量級(jí)鎖

指向重量級(jí)鎖的指針

10

GC標(biāo)記

11

通俗解釋

  • Mark Word 像一個(gè)多功能顯示屏,顯示的內(nèi)容根據(jù)對(duì)象狀態(tài)切換。
  • 比如,對(duì)象沒(méi)被鎖時(shí),顯示“哈希碼”和“GC年齡”;被鎖住時(shí),顯示“鎖信息”和“線程ID”。

2.2 Class Metadata Address

這部分是一個(gè)指針,指向?qū)ο笏鶎兕惖脑獢?shù)據(jù)(Class Metadata),存儲(chǔ)在JVM的方法區(qū)(或元空間)。元數(shù)據(jù)包含類的結(jié)構(gòu)信息,比如:

  • 類名、父類、接口。
  • 方法表、字段表。
  • 靜態(tài)變量等。

通俗解釋

  • 就像身份證上的“籍貫”,告訴JVM這個(gè)對(duì)象是哪個(gè)類的實(shí)例。
  • JVM通過(guò)這個(gè)指針找到類的“藍(lán)圖”,知道如何操作這個(gè)對(duì)象。

2.3 Array Length

如果對(duì)象是數(shù)組(比如int[ ]),對(duì)象頭會(huì)額外包含一個(gè)4字節(jié)的字段,記錄數(shù)組的長(zhǎng)度。普通對(duì)象沒(méi)有這一部分。

通俗解釋

  • 數(shù)組就像一個(gè)貨架,Array Length 告訴你貨架上有多少格子。

三、對(duì)象頭的作用和底層原理

3.1 對(duì)象頭在鎖機(jī)制中的作用

對(duì)象頭是synchronized鎖的核心,因?yàn)樗鎯?chǔ)了鎖狀態(tài)和Monitor信息。以下是synchronized鎖的工作原理與對(duì)象頭的關(guān)聯(lián):

  1. 無(wú)鎖狀態(tài)

    • Mark Word 存儲(chǔ)哈希碼和GC年齡,鎖標(biāo)志位是01。
    • 對(duì)象未被任何線程鎖定。
  2. 偏向鎖

    • 當(dāng)一個(gè)線程首次獲取鎖時(shí),JVM將Mark Word中的線程ID設(shè)為該線程ID,鎖標(biāo)志位仍為01。
    • 偏向鎖假設(shè)鎖通常被同一線程持有,減少鎖獲取的開(kāi)銷。
    • 例如:Mark Word 記錄“線程A的ID”,下次線程A再獲取鎖時(shí),直接檢查ID,無(wú)需額外操作。
  3. 輕量級(jí)鎖

    • 如果有輕微競(jìng)爭(zhēng)(比如另一個(gè)線程嘗試獲取鎖),JVM將鎖升級(jí)為輕量級(jí)鎖。
    • Mark Word 存儲(chǔ)一個(gè)指向鎖記錄的指針(如線程棧中的記錄),鎖標(biāo)志位變?yōu)?code>00。
    • 鎖記錄保存了原來(lái)的Mark Word內(nèi)容,釋放鎖時(shí)恢復(fù)。
  4. 重量級(jí)鎖

    • 如果競(jìng)爭(zhēng)激烈(多個(gè)線程爭(zhēng)搶鎖),JVM將鎖升級(jí)為重量級(jí)鎖。
    • Mark Word 存儲(chǔ)一個(gè)指向Monitor的指針,鎖標(biāo)志位變?yōu)?code>10。
    • Monitor 是一個(gè)操作系統(tǒng)級(jí)別的互斥鎖(Mutex),管理線程的等待和喚醒。

通俗例子

  • 想象對(duì)象是一個(gè)房間,Mark Word 是門上的鎖。
  • 無(wú)鎖:門沒(méi)鎖,任何人都能進(jìn)。
  • 偏向鎖:門上貼了“只許小明進(jìn)”的標(biāo)簽,小明不用每次都開(kāi)鎖。
  • 輕量級(jí)鎖:小明和朋友輪流用鑰匙開(kāi)鎖,稍微麻煩點(diǎn)。
  • 重量級(jí)鎖:請(qǐng)了個(gè)保安(Monitor)守門,所有人排隊(duì)登記才能進(jìn)。

3.2 對(duì)象頭在垃圾回收中的作用

Mark Word 中的分代年齡(GC Age)用于JVM的分代垃圾回收(Generational GC):

  • 每次對(duì)象在Minor GC中存活,年齡加1。
  • 當(dāng)年齡達(dá)到閾值(默認(rèn)15),對(duì)象晉升到老年代。
  • Mark Word 的GC標(biāo)記位(11)在GC期間用于標(biāo)記對(duì)象是否存活。

通俗解釋

  • 分代年齡就像人的年齡,記錄對(duì)象“活了多久”。
  • JVM通過(guò)年齡判斷對(duì)象是否“老了”,決定是否搬到“養(yǎng)老院”(老年代)。

3.3 對(duì)象頭在哈希碼中的作用

當(dāng)調(diào)用對(duì)象的hashCode()方法時(shí),JVM將哈希碼存儲(chǔ)在Mark Word中。如果對(duì)象被鎖住,哈希碼可能被暫時(shí)移到Monitor或鎖記錄中。

通俗解釋

  • 哈希碼就像對(duì)象的“身份證號(hào)”,用于HashMap等場(chǎng)景。
  • Mark Word 是身份證的“號(hào)碼欄”,鎖住時(shí)號(hào)碼可能被臨時(shí)抄到別處。

四、對(duì)象頭的源碼分析

對(duì)象頭的實(shí)現(xiàn)主要在HotSpot JVM的C++代碼中,位于src/hotspot/share/oops/目錄。我們重點(diǎn)分析Mark Word和相關(guān)邏輯。

4.1 Mark Word的定義

在HotSpot JVM中,Mark Word 由markOop類表示,定義在markOop.hpp中:

// src/hotspot/share/oops/markOop.hpp
class markOopDesc : public oopDesc {
private:
  uintptr_t _value; // Mark Word的實(shí)際值(64位機(jī)器上是64位)

public:
  // 獲取鎖狀態(tài)
  inline uintptr_t lock_bits() const {
    return (_value & lock_mask_in_place);
  }

  // 獲取線程ID(偏向鎖)
  inline uintptr_t biased_thread_id() const {
    return (_value >> biased_lock_thread_id_shift);
  }

  // 獲取哈希碼
  inline uintptr_t hash() const {
    return (_value >> hash_shift) & hash_mask;
  }

  // 獲取分代年齡
  inline uintptr_t age() const {
    return (_value >> age_shift) & age_mask;
  }
};

關(guān)鍵點(diǎn)解釋

  • _value 是一個(gè)64位整數(shù),存儲(chǔ)Mark Word的所有信息。
  • 通過(guò)位運(yùn)算(>>&)提取鎖狀態(tài)、線程ID、哈希碼、年齡等。
  • 鎖標(biāo)志位(最低2位)決定Mark Word的當(dāng)前狀態(tài)(01、00、1011)。

4.2 對(duì)象頭的內(nèi)存布局

HotSpot JVM中,對(duì)象的內(nèi)存布局由oopDesc類定義,位于oop.hpp:

// src/hotspot/share/oops/oop.hpp
class oopDesc {
private:
  volatile markOop _mark; // Mark Word
  Klass* _metadata;       // Class Metadata Address
};
  • _mark:Mark Word,存儲(chǔ)鎖狀態(tài)等。
  • _metadata:指向類元數(shù)據(jù)的指針。

如果對(duì)象是數(shù)組,還會(huì)額外包含數(shù)組長(zhǎng)度字段(由JVM在分配內(nèi)存時(shí)添加)。

4.3 鎖狀態(tài)的切換邏輯

鎖狀態(tài)的切換在 synchronizer.cpp 中實(shí)現(xiàn),涉及偏向鎖、輕量級(jí)鎖、重量級(jí)鎖的轉(zhuǎn)換。以下是簡(jiǎn)化邏輯:

// src/hotspot/share/runtime/synchronizer.cpp
void ObjectSynchronizer::enter(Handle obj, BasicLock* lock, Thread* self) {
  markOop mark = obj->mark(); // 獲取Mark Word

  if (mark->is_neutral()) { // 無(wú)鎖狀態(tài)
    // 嘗試偏向鎖
    if (UseBiasedLocking) {
      markOop biased = mark->biased_to(self); // 設(shè)置線程ID
      if (Atomic::cmpxchg(biased, obj->mark_addr(), mark) == mark) {
        return; // 偏向成功
      }
    }
    // 嘗試輕量級(jí)鎖
    lock->set_displaced_header(mark); // 保存Mark Word到鎖記錄
    if (Atomic::cmpxchg((markOop)lock, obj->mark_addr(), mark) == mark) {
      return; // 輕量級(jí)鎖成功
    }
  }

  // 升級(jí)到重量級(jí)鎖
  ObjectMonitor* monitor = inflate_monitor(obj, self);
  monitor->enter(self); // 進(jìn)入Monitor
}

關(guān)鍵點(diǎn)解釋

  1. 無(wú)鎖到偏向鎖
    • 檢查Mark Word是否為無(wú)鎖(is_neutral())。
    • 用CAS(cmpxchg)將線程ID寫入Mark Word。
  2. 偏向鎖到輕量級(jí)鎖
    • 如果有競(jìng)爭(zhēng),撤銷偏向鎖(biased_to失?。?。
    • 將Mark Word替換為鎖記錄指針,保存原Mark Word到鎖記錄。
  3. 輕量級(jí)鎖到重量級(jí)鎖
    • 如果競(jìng)爭(zhēng)加劇,創(chuàng)建Monitor(inflate_monitor)。
    • Mark Word指向Monitor,進(jìn)入操作系統(tǒng)級(jí)鎖。

4.4 Monitor與對(duì)象頭的交互

重量級(jí)鎖依賴ObjectMonitor類(objectMonitor.hpp),Mark Word存儲(chǔ)Monitor指針:

class ObjectMonitor {
private:
  Thread* _owner; // 持有鎖的線程
  markOop _header; // 保存原來(lái)的Mark Word
  // ...
};
  • 當(dāng)鎖升級(jí)為重量級(jí)鎖,Mark Word指向ObjectMonitor實(shí)例。
  • 釋放鎖時(shí),ObjectMonitor將保存的 _header(原Mark Word)恢復(fù)到對(duì)象頭。

五、對(duì)象頭的內(nèi)存開(kāi)銷和優(yōu)化

5.1 內(nèi)存開(kāi)銷

在64位JVM中,對(duì)象頭的典型大?。?/p>

  • 普通對(duì)象:8字節(jié)(Mark Word)+ 8字節(jié)(Class Metadata Address)= 16字節(jié)。
  • 數(shù)組對(duì)象:16字節(jié) + 4字節(jié)(Array Length)= 20字節(jié)。

這意味著即使一個(gè)空對(duì)象(無(wú)字段)也有16字節(jié)的開(kāi)銷,主要來(lái)自對(duì)象頭。

5.2 指針壓縮

為了減少內(nèi)存開(kāi)銷,HotSpot JVM支持指針壓縮(-XX:+UseCompressedOops):

  • 將64位指針壓縮為32位(通過(guò)偏移編碼)。
  • 壓縮后,對(duì)象頭大小變?yōu)椋?ul>
  • 普通對(duì)象:8字節(jié)(Mark Word)+ 4字節(jié)(壓縮的Class Metadata Address)= 12字節(jié)。
  • 數(shù)組對(duì)象:12字節(jié) + 4字節(jié)(Array Length)= 16字節(jié)。

通俗解釋

  • 指針壓縮就像把“詳細(xì)地址”的省市縣簡(jiǎn)化成“郵編”,節(jié)省空間。

5.3 鎖優(yōu)化

對(duì)象頭的鎖狀態(tài)切換(偏向鎖 → 輕量級(jí)鎖 → 重量級(jí)鎖)是JVM的性能優(yōu)化:

  • 偏向鎖:適合單線程場(chǎng)景,Mark Word直接記錄線程ID,獲取鎖幾乎無(wú)開(kāi)銷。
  • 輕量級(jí)鎖:適合低競(jìng)爭(zhēng)場(chǎng)景,用CAS操作鎖記錄,減少系統(tǒng)調(diào)用。
  • 重量級(jí)鎖:適合高競(jìng)爭(zhēng)場(chǎng)景,依賴操作系統(tǒng)Mutex,但開(kāi)銷大。

六、完整流程

  1. 對(duì)象頭的定義

    • 每個(gè)Java對(duì)象在內(nèi)存中包含對(duì)象頭,分為Mark Word、Class Metadata Address、Array Length(可選)。
    • Mark Word 是動(dòng)態(tài)部分,存儲(chǔ)鎖狀態(tài)、哈希碼、GC年齡等。
  2. 對(duì)象頭的作用

    • 鎖機(jī)制:通過(guò)Mark Word實(shí)現(xiàn)synchronized的偏向鎖、輕量級(jí)鎖、重量級(jí)鎖。
    • 垃圾回收:記錄分代年齡,支持分代GC。
    • 類型信息:指向類元數(shù)據(jù),確定對(duì)象類型。
    • 哈希碼:存儲(chǔ)hashCode()值。
  3. 底層實(shí)現(xiàn)

    • Mark Word 由markOop類管理,通過(guò)位運(yùn)算提取信息。
    • 鎖狀態(tài)切換由synchronizer.cpp實(shí)現(xiàn),涉及CAS和Monitor。
    • 對(duì)象頭與JVM的內(nèi)存管理和線程調(diào)度緊密協(xié)作。
  4. 內(nèi)存優(yōu)化

    • 指針壓縮減少對(duì)象頭大?。?6字節(jié) → 12字節(jié))。
    • 鎖優(yōu)化(偏向鎖、輕量級(jí)鎖)降低鎖開(kāi)銷。

七、通俗總結(jié)

  • 對(duì)象頭是什么?它是對(duì)象的“身份證”,記錄鎖狀態(tài)、類型信息、年齡等。
  • 怎么工作?Mark Word 像一個(gè)多功能顯示屏,根據(jù)對(duì)象狀態(tài)切換顯示內(nèi)容(鎖、哈希碼等)。
  • 為什么重要?沒(méi)有對(duì)象頭,JVM無(wú)法實(shí)現(xiàn)鎖、垃圾回收等核心功能。
  • 底層實(shí)現(xiàn)?通過(guò)HotSpot JVM的C++代碼(markOop、synchronizer)管理,依賴位運(yùn)算和操作系統(tǒng)支持。

生活化比喻

  • 對(duì)象頭就像一個(gè)智能門牌,平時(shí)顯示房間號(hào)(類型信息)、住戶ID(鎖狀態(tài))、房屋年齡(GC年齡)。
  • 當(dāng)有人敲門(線程訪問(wèn)),門牌會(huì)切換顯示“誰(shuí)能進(jìn)”(鎖信息),還能記錄“敲門次數(shù)”(哈希碼)。

八、擴(kuò)展閱讀

  1. 源碼推薦
    • HotSpot JVM:markOop.hpp(Mark Word定義)、synchronizer.cpp(鎖邏輯)。
    • 相關(guān)類:oop.hpp(對(duì)象布局)、objectMonitor.hpp(Monitor實(shí)現(xiàn))。
  2. 工具
    • 用jmap -histo查看對(duì)象內(nèi)存占用,分析對(duì)象頭開(kāi)銷。
    • 用jol(Java Object Layout)庫(kù)查看對(duì)象頭結(jié)構(gòu)。
  3. 書籍
    • 《深入理解Java虛擬機(jī)》(周志明):深入講解JVM內(nèi)存和對(duì)象頭。
    • 《Java并發(fā)編程實(shí)戰(zhàn)》:結(jié)合鎖機(jī)制理解對(duì)象頭。

到此這篇關(guān)于Java的對(duì)象頭原理與源碼超詳細(xì)講解的文章就介紹到這了,更多相關(guān)Java對(duì)象頭原理詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 實(shí)時(shí)計(jì)算知多少?

    實(shí)時(shí)計(jì)算知多少?

    這篇文章對(duì)滑動(dòng)窗口計(jì)數(shù)的概念和關(guān)鍵代碼做了較為詳細(xì)解釋,讓我們對(duì)實(shí)時(shí)計(jì)算這一概念有了更深的了解,需要的朋友可以參考下
    2015-07-07
  • Java中的Phaser使用詳解

    Java中的Phaser使用詳解

    這篇文章主要介紹了Java中的Phaser使用詳解,與其他障礙不同,注冊(cè)在phaser上進(jìn)行同步的parties數(shù)量可能會(huì)隨時(shí)間變化,任務(wù)可以隨時(shí)進(jìn)行注冊(cè),需要的朋友可以參考下
    2023-11-11
  • 解決Spring?Security升級(jí)到5.5.7、5.6.4及以上啟動(dòng)報(bào)錯(cuò)出現(xiàn)版本不兼容的問(wèn)題

    解決Spring?Security升級(jí)到5.5.7、5.6.4及以上啟動(dòng)報(bào)錯(cuò)出現(xiàn)版本不兼容的問(wèn)題

    這篇文章主要介紹了解決Spring?Security升級(jí)到5.5.7、5.6.4及以上啟動(dòng)報(bào)錯(cuò)出現(xiàn)版本不兼容的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 詳解領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)之事件驅(qū)動(dòng)與CQRS

    詳解領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)之事件驅(qū)動(dòng)與CQRS

    這篇文章分析了如何應(yīng)用事件來(lái)分離軟件核心復(fù)雜度。探究CQRS為什么廣泛應(yīng)用于DDD項(xiàng)目中,以及如何落地實(shí)現(xiàn)CQRS框架。當(dāng)然我們也要警惕一些失敗的教訓(xùn),利弊分析以后再去抉擇正確的應(yīng)對(duì)之道
    2021-06-06
  • java實(shí)現(xiàn)圖片無(wú)損任意角度旋轉(zhuǎn)

    java實(shí)現(xiàn)圖片無(wú)損任意角度旋轉(zhuǎn)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)圖片無(wú)損任意角度旋轉(zhuǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Java單例模式的五種實(shí)現(xiàn)方式

    Java單例模式的五種實(shí)現(xiàn)方式

    單例模式(Singleton Pattern)是Java中最簡(jiǎn)單的設(shè)計(jì)模式之一,這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式,下面這篇文章主要給大家介紹了關(guān)于Java單例模式的五種實(shí)現(xiàn)方式?,需要的朋友可以參考下
    2022-06-06
  • Java三大特性-封裝知識(shí)小結(jié)

    Java三大特性-封裝知識(shí)小結(jié)

    所有的面向?qū)ο缶幊陶Z(yǔ)言的思路都是差不多的,而這三大特性,則是思路中的支柱點(diǎn),接下來(lái)我就重點(diǎn)講解了一下java三大特性-封裝,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-03-03
  • spring boot使用自定義的線程池執(zhí)行Async任務(wù)

    spring boot使用自定義的線程池執(zhí)行Async任務(wù)

    這篇文章主要介紹了spring boot使用自定義的線程池執(zhí)行Async任務(wù)的相關(guān)資料,需要的朋友可以參考下
    2018-02-02
  • 如何通過(guò)Maven倉(cāng)庫(kù)安裝Spire系列的Java產(chǎn)品

    如何通過(guò)Maven倉(cāng)庫(kù)安裝Spire系列的Java產(chǎn)品

    這篇文章主要介紹了如何通過(guò)Maven倉(cāng)庫(kù)安裝Spire系列的Java產(chǎn)品,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • idea中文件被Mark as Plain Text后恢復(fù)方式

    idea中文件被Mark as Plain Text后恢復(fù)方式

    在IntelliJ IDEA中,如果錯(cuò)誤地將文件標(biāo)記為純文本(Mark as Plain Text),可以通過(guò)在項(xiàng)目目錄中右鍵點(diǎn)擊文件并選擇“Mark as”來(lái)恢復(fù)原文件類型
    2024-11-11

最新評(píng)論

军事| 砚山县| 台前县| 定西市| 大冶市| 体育| 吉隆县| 陇川县| 仁化县| 连江县| 竹溪县| 门源| 沙洋县| 泰安市| 长泰县| 九龙县| 玉树县| 津市市| 四平市| 广元市| 九江县| 浮山县| 丰镇市| 紫金县| 东港市| 德江县| 南安市| 建瓯市| 寿宁县| 泊头市| 眉山市| 惠州市| 沂源县| 安达市| 康保县| 嵊州市| 唐山市| 阜平县| 建昌县| 同仁县| 盈江县|