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

Java 的 Monitor 機(jī)制之從原理與源碼解讀

 更新時(shí)間:2025年09月29日 09:07:41   作者:goTsHgo  
本文詳解Java Monitor機(jī)制,作為synchronized底層實(shí)現(xiàn),管理線程同步與協(xié)調(diào),涵蓋結(jié)構(gòu)、源碼及對象頭交互,并討論偏向鎖、輕量級鎖等優(yōu)化策略,感興趣的朋友跟隨小編一起看看吧

        本文將從底層原理和源代碼層面詳細(xì)解釋 Java 的 Monitor 機(jī)制,盡量用通俗易懂的語言讓初學(xué)者也能理解。從概念開始,逐步深入到實(shí)現(xiàn)細(xì)節(jié),涵蓋 Monitor 的作用、結(jié)構(gòu)、源碼分析,并提供完整的步驟和推導(dǎo)。由于 Monitor 是 Java 鎖機(jī)制(尤其是 synchronized)的核心,我會(huì)結(jié)合對象頭和鎖的場景增強(qiáng)理解。

一、什么是 Java 的 Monitor?為什么需要它?

1.1 Monitor 的通俗概念

        Monitor(監(jiān)視器)是 Java 中實(shí)現(xiàn)線程同步的核心機(jī)制,可以看作一個(gè)“獨(dú)占門鎖”。想象一個(gè)只有一張票的電影院(共享資源),Monitor 就像檢票員,確保同一時(shí)間只有一個(gè)觀眾(線程)能進(jìn)去看電影,其他人得在門口排隊(duì)等著。

        在 Java 中,Monitor 是 synchronized 關(guān)鍵字的底層實(shí)現(xiàn),用于保證多線程訪問共享資源時(shí)的線程安全。每個(gè) Java 對象都可以關(guān)聯(lián)一個(gè) Monitor,充當(dāng)鎖的角色。

1.2 為什么需要 Monitor?

        在多線程編程中,多個(gè)線程可能同時(shí)訪問共享資源(比如一個(gè)變量或?qū)ο螅绻麤]有協(xié)調(diào)機(jī)制,會(huì)導(dǎo)致數(shù)據(jù)不一致。例如:

public class Counter {
    private int count = 0;
    public void increment() {
        count++; // 看似簡單,實(shí)際包含讀、加、寫三步
    }
}

count++ 包含三個(gè)步驟:

  1. 讀取 count 的值。
  2. 加 1。
  3. 寫回新值。

如果兩個(gè)線程同時(shí)執(zhí)行 increment(),可能出現(xiàn):

  • 線程 A 讀取 count = 0
  • 線程 B 讀取 count = 0。
  • 線程 A 計(jì)算 0 + 1 = 1,寫回 count = 1。
  • 線程 B 計(jì)算 0 + 1 = 1,寫回 count = 1。

結(jié)果是兩次加操作后,count 仍為 1,而不是 2。Monitor 通過確保同一時(shí)間只有一個(gè)線程執(zhí)行關(guān)鍵代碼(臨界區(qū)),解決了這個(gè)問題。

通俗解釋

  • Monitor 像一個(gè)“排隊(duì)系統(tǒng)”,確保只有一個(gè)線程能“進(jìn)門”操作共享資源,其他線程在外面等著。

二、Monitor 在 Java 中的作用

Monitor 是 synchronized 關(guān)鍵字的底層實(shí)現(xiàn),負(fù)責(zé):

  1. 互斥訪問:同一時(shí)間只有一個(gè)線程能持有 Monitor,進(jìn)入臨界區(qū)。
  2. 線程協(xié)調(diào):支持線程的等待和喚醒(通過 wait()、notify()、notifyAll())。
  3. 鎖狀態(tài)管理:記錄鎖的持有者、等待隊(duì)列等。

Monitor 與對象頭緊密相關(guān),對象頭的 Mark Word 在重量級鎖狀態(tài)下會(huì)指向 Monitor 實(shí)例。

三、Monitor 的工作原理

3.1 Monitor 的核心組件

Monitor 是一個(gè)操作系統(tǒng)級別的同步工具,通常包含以下部分:

  1. Owner(持有者):當(dāng)前持有鎖的線程。
  2. Entry Set(進(jìn)入隊(duì)列):等待獲取鎖的線程隊(duì)列。
  3. Wait Set(等待隊(duì)列):調(diào)用 wait() 后釋放鎖并等待的線程。
  4. Recursions(重入計(jì)數(shù)):記錄同一線程重入鎖的次數(shù)(支持可重入鎖)。

通俗例子

  • 想象一個(gè)廁所(共享資源),只有一個(gè)坑位,Monitor 是門上的智能鎖:
    • Owner:正在用廁所的人(當(dāng)前線程)。
    • Entry Set:在門口排隊(duì)等坑位的人(等待鎖的線程)。
    • Wait Set:暫時(shí)出去喝咖啡、等著被叫回來的人(調(diào)用 wait() 的線程)。
    • Recursions:記錄同一個(gè)人反復(fù)進(jìn)出廁所的次數(shù)(重入鎖)。

3.2 Monitor 的狀態(tài)轉(zhuǎn)換

Monitor 的工作涉及以下狀態(tài)和操作:

  1. 獲取鎖(Enter)
    • 線程嘗試進(jìn)入 Monitor。
    • 如果 Monitor 空閑,線程成為 Owner。
    • 如果已被占用,線程進(jìn)入 Entry Set 等待。
  2. 執(zhí)行臨界區(qū):Owner 線程執(zhí)行 synchronized 代碼。
  3. 釋放鎖(Exit)
    • Owner 線程退出臨界區(qū),釋放 Monitor。
    • 喚醒 Entry Set 中的一個(gè)線程(或 Wait Set 中的線程,如果有 notify())。
  4. 等待和喚醒
    • 線程調(diào)用 wait(),釋放 Monitor,進(jìn)入 Wait Set。
    • 其他線程調(diào)用 notify() 或 notifyAll(),喚醒 Wait Set 中的線程。

四、Monitor 的底層實(shí)現(xiàn)

        Monitor 的實(shí)現(xiàn)主要在 HotSpot JVM 的 C++ 源碼中,核心類是 ObjectMonitor,位于 src/hotspot/share/runtime/objectMonitor.hpp。以下從源碼和原理逐步分析。

4.1 ObjectMonitor 的結(jié)構(gòu)

ObjectMonitor 是 HotSpot JVM 中 Monitor 的具體實(shí)現(xiàn),包含以下關(guān)鍵字段(簡化版):

class ObjectMonitor {
private:
  volatile Thread* _owner;         // 當(dāng)前持有鎖的線程
  volatile intptr_t _recursions;   // 重入次數(shù)
  ObjectWaiter* _EntryList;       // 等待鎖的線程隊(duì)列(Entry Set)
  ObjectWaiter* _WaitSet;         // 等待notify的線程隊(duì)列(Wait Set)
  markOop _header;                // 保存對象的Mark Word
  volatile int _count;             // 等待線程數(shù)
  volatile int _waiters;           // Wait Set中的線程數(shù)
  // ...
};

字段解釋

  1. _owner:指向當(dāng)前持有 Monitor 的線程。如果為空,表示 Monitor 空閑。
  2. _recursions:記錄重入次數(shù)。例如,線程多次進(jìn)入同一 synchronized 塊,計(jì)數(shù)加 1。
  3. _EntryList:一個(gè)鏈表,存儲(chǔ)等待獲取鎖的線程(阻塞狀態(tài))。
  4. _WaitSet:一個(gè)鏈表,存儲(chǔ)調(diào)用 wait() 的線程(等待被喚醒)。
  5. _header:保存對象頭的 Mark Word,鎖釋放時(shí)恢復(fù)。
  6. _count:Entry Set 中的線程數(shù),用于優(yōu)化。
  7. _waiters:Wait Set 中的線程數(shù),用于管理等待線程。

通俗解釋

  • ObjectMonitor 像一個(gè)智能門鎖的控制面板,記錄“誰在用”(Owner)、“誰在排隊(duì)”(EntryList)、“誰在休息”(WaitSet)。

4.2 Monitor 的工作流程

以下是 Monitor 的核心操作流程,結(jié)合源碼分析:

4.2.1 獲取鎖(enter)

當(dāng)線程執(zhí)行 synchronized 代碼時(shí),JVM 調(diào)用 ObjectMonitor::enter:

void ObjectMonitor::enter(Thread* self) {
  if (_owner == self) {
    _recursions++; // 重入,增加計(jì)數(shù)
    return;
  }
  if (_owner == nullptr && Atomic::cmpxchg(self, &_owner, nullptr) == nullptr) {
    // 無人持有,CAS設(shè)置自己為Owner
    return;
  }
  // 鎖被占用,進(jìn)入EntryList
  add_to_entry_list(self);
  self->park(); // 線程阻塞
}

步驟

  1. 檢查重入
    • 如果當(dāng)前線程已經(jīng)是 _owner,說明是重入鎖,增加 _recursions 計(jì)數(shù),直接返回。
    • 通俗解釋:如果廁所里的人是你自己,就不用再排隊(duì),直接繼續(xù)用。
  2. 嘗試獲取空閑鎖
    • 如果 _owner 為空,用 CAS(Compare-And-Swap)原子操作設(shè)置 _owner 為當(dāng)前線程。
    • CAS 確保多線程競爭時(shí)只有一個(gè)線程成功。
    • 通俗解釋:如果廁所沒人,趕緊把門鎖上,標(biāo)上“我的名字”。
  3. 進(jìn)入等待隊(duì)列
    • 如果鎖被占用,線程加入 _EntryList,調(diào)用 park() 阻塞自己。
    • 通俗解釋:如果有人在用,就去門口排隊(duì),暫時(shí)“睡著”。

4.2.2 釋放鎖(exit)

當(dāng)線程退出 synchronized 塊時(shí),JVM 調(diào)用 ObjectMonitor::exit:

void ObjectMonitor::exit(Thread* self) {
  if (_recursions > 0) {
    _recursions--; // 減少重入計(jì)數(shù)
    return;
  }
  if (_owner != self) {
    return; // 非Owner線程不能釋放
  }
  _owner = nullptr; // 釋放鎖
  if (_EntryList != nullptr || _WaitSet != nullptr) {
    notify_waiters(); // 喚醒等待線程
  }
}

步驟

  1. 檢查重入
    • 如果 _recursions 大于 0,減少計(jì)數(shù),不釋放鎖。
    • 通俗解釋:你還沒完全“離開”廁所,只是少用了一次。
  2. 驗(yàn)證 Owner
    • 確保當(dāng)前線程是 _owner,防止非法釋放。
    • 通俗解釋:只有用廁所的人才能開鎖。
  3. 釋放鎖
    • 設(shè)置 _owner 為 nullptr,表示鎖空閑。
    • 通俗解釋:把門鎖打開,標(biāo)上“沒人用”。
  4. 喚醒等待線程
    • 如果 _EntryList 或 _WaitSet 不為空,喚醒一個(gè)或多個(gè)線程(通過 unpark())。
    • 通俗解釋:喊一聲“下一個(gè)”,讓排隊(duì)的人進(jìn)來。

4.2.3 等待(wait)

當(dāng)線程調(diào)用 Object.wait() 時(shí),JVM 調(diào)用 ObjectMonitor::wait:

void ObjectMonitor::wait(Thread* self, jlong millis) {
  if (_owner != self) {
    return; // 非Owner不能wait
  }
  // 保存狀態(tài)
  ObjectWaiter node(self);
  _WaitSet->append(&node); // 加入Wait Set
  _recursions = 0; // 重置重入計(jì)數(shù)
  exit(self); // 釋放鎖
  self->park(millis); // 阻塞等待
}

步驟

  1. 驗(yàn)證 Owner
    • 確保當(dāng)前線程是 _owner,因?yàn)橹挥墟i持有者能調(diào)用 wait()。
    • 通俗解釋:只有在廁所里的人才能說“我先出去等會(huì)兒”。
  2. 加入 Wait Set
    • 創(chuàng)建一個(gè) ObjectWaiter 節(jié)點(diǎn),加入 _WaitSet。
    • 通俗解釋:把名字寫在“休息區(qū)”名單上。
  3. 釋放鎖
    • 重置 _recursions,調(diào)用 exit() 釋放鎖。
    • 通俗解釋:開門出去,讓別人用廁所。
  4. 阻塞線程
    • 調(diào)用 park(millis),線程阻塞(如果指定了超時(shí)時(shí)間 millis)。
    • 通俗解釋:去旁邊“睡著”,等著被叫醒。

4.2.4 喚醒(notify/notifyAll)

當(dāng)線程調(diào)用 Object.notify() 或 notifyAll() 時(shí),JVM 調(diào)用 ObjectMonitor::notify:

void ObjectMonitor::notify(TRAPS) {
  if (_WaitSet == nullptr) {
    return; // 沒有等待線程
  }
  ObjectWaiter* waiter = _WaitSet->remove_first(); // 取出一個(gè)線程
  add_to_entry_list(waiter->thread()); // 加入EntryList
  waiter->thread()->unpark(); // 喚醒線程
}
void ObjectMonitor::notifyAll(TRAPS) {
  while (_WaitSet != nullptr) {
    notify(); // 逐個(gè)喚醒
  }
}

步驟

  1. 檢查 Wait Set
    • 如果 _WaitSet 為空,直接返回。
    • 通俗解釋:如果休息區(qū)沒人,不用喊。
  2. 喚醒線程(notify)
    • 從 _WaitSet 取出一個(gè)線程,加入 _EntryList,調(diào)用 unpark() 喚醒。
    • 通俗解釋:叫醒休息區(qū)的一個(gè)人,讓他去排隊(duì)搶鎖。
  3. 喚醒所有線程(notifyAll)
    • 循環(huán)調(diào)用 notify(),喚醒 _WaitSet 中所有線程。
    • 通俗解釋:喊“大家都回來排隊(duì)”,讓休息區(qū)所有人去搶鎖。

4.3 Monitor 與對象頭的交互

Monitor 與對象頭的 Mark Word 緊密相關(guān):

  • 當(dāng)鎖升級為重量級鎖,Mark Word 存儲(chǔ)指向 ObjectMonitor 的指針(鎖標(biāo)志位為 10)。
  • ObjectMonitor 的 _header 字段保存原始 Mark Word(包括哈希碼、GC 年齡等)。
  • 釋放鎖時(shí),JVM 將 _header 恢復(fù)到對象頭的 Mark Word。

通俗解釋

  • Mark Word 像門上的“地址牌”,重量級鎖時(shí)指向“保安室”(Monitor)。
  • Monitor 像保安室,記錄門的原始信息(_header),解鎖時(shí)把地址牌換回去。

4.4 字節(jié)碼層面的支持

synchronized 代碼被編譯為字節(jié)碼指令 monitorenter 和 monitorexit:

synchronized(obj) {
    count++;
}

字節(jié)碼(簡化)

monitorenter // 獲取Monitor
iload count
iadd 1
istore count
monitorexit // 釋放Monitor
  • monitorenter:調(diào)用 ObjectMonitor::enter,嘗試獲取鎖。
  • monitorexit:調(diào)用 ObjectMonitor::exit,釋放鎖。

五、Monitor 的底層操作系統(tǒng)支持

Monitor 的阻塞和喚醒依賴操作系統(tǒng)的線程調(diào)度機(jī)制:

  1. park/unpark
    • park():阻塞線程,底層調(diào)用操作系統(tǒng)的 pthread_cond_wait(Linux)或類似機(jī)制。
    • unpark():喚醒線程,底層調(diào)用 pthread_cond_signal 或 futex(Linux)。
  2. 互斥鎖(Mutex)
    • Monitor 的互斥性通過操作系統(tǒng)的 pthread_mutex(Linux)或類似機(jī)制實(shí)現(xiàn)。
    • CAS 操作(Atomic::cmpxchg)依賴 CPU 的原子指令(如 cmpxchg)。

通俗解釋

  • Monitor 像一個(gè)“智能門鎖”,但真正的“鎖芯”是操作系統(tǒng)提供的。
  • 線程“睡著”或“醒來”靠操作系統(tǒng)調(diào)度,就像保安喊“下一個(gè)”。

六、Monitor 的優(yōu)化

JVM 對 Monitor 進(jìn)行了大量優(yōu)化,減少性能開銷:

  1. 偏向鎖
    • 如果鎖通常被同一線程持有,Mark Word 記錄線程 ID,避免創(chuàng)建 Monitor。
    • 通俗解釋:給常來的人發(fā)“VIP卡”,不用每次找保安。
  2. 輕量級鎖
    • 低競爭時(shí),使用 CAS 操作鎖記錄,不創(chuàng)建 Monitor。
    • 通俗解釋:用“臨時(shí)鑰匙”代替保安,速度更快。
  3. 重量級鎖
    • 高競爭時(shí)才使用 Monitor,依賴操作系統(tǒng)。
    • 通俗解釋:人太多,只能請保安(Monitor)來管秩序。
  4. 自旋鎖
    • 線程在 park() 前可能短暫自旋(循環(huán)嘗試),避免立即阻塞。
    • 通俗解釋:排隊(duì)時(shí)先看一眼門開了沒,省得直接睡著。

這些優(yōu)化通過對象頭的 Mark Word 動(dòng)態(tài)切換鎖狀態(tài)(無鎖 → 偏向鎖 → 輕量級鎖 → 重量級鎖)。

七、完整推導(dǎo)流程

  • 問題背景
    • 多線程并發(fā)訪問共享資源可能導(dǎo)致數(shù)據(jù)不一致,需通過鎖保證線程安全。
    • Monitor 是 synchronized 的核心實(shí)現(xiàn),管理互斥和線程協(xié)調(diào)。
  • Monitor 的結(jié)構(gòu)
    • 包含 Owner、EntryList、WaitSet、Recursions 等,記錄鎖狀態(tài)和線程隊(duì)列。
    • 與對象頭的 Mark Word 交互,重量級鎖時(shí)存儲(chǔ) Monitor 指針。
  • 工作流程
    • 獲取鎖:檢查重入、嘗試 CAS 獲取、或加入 EntryList 阻塞。
    • 釋放鎖:減少重入計(jì)數(shù)、置空 Owner、喚醒等待線程。
    • 等待/喚醒:通過 Wait Set 實(shí)現(xiàn) wait() 和 notify(),涉及鎖釋放和重新獲取。
  • 底層實(shí)現(xiàn)
    • ObjectMonitor 類管理 Monitor 邏輯,源碼在 objectMonitor.cpp。
    • 依賴操作系統(tǒng) Mutex 和線程調(diào)度(park/unpark)。
  • 優(yōu)化
    • 偏向鎖、輕量級鎖減少 Monitor 使用,重量級鎖作為 fallback。
    • 自旋鎖和 CAS 提高效率。

八、通俗總結(jié)

  • Monitor 是什么?它是 synchronized 的“門鎖”,確保線程排隊(duì)訪問共享資源。
  • 怎么工作?像一個(gè)智能保安,記錄“誰在用”(Owner)、“誰在等”(EntryList/WaitSet),支持等待和喚醒。
  • 為什么重要?沒有 Monitor,synchronized 無法實(shí)現(xiàn)線程安全和協(xié)調(diào)。
  • 底層實(shí)現(xiàn)?通過 HotSpot JVM 的 ObjectMonitor 類,依賴操作系統(tǒng)互斥鎖和調(diào)度。

生活化比喻

  • Monitor 像一個(gè)廁所的智能門鎖:
    • 有人用時(shí),標(biāo)上“占用”(Owner)。
    • 有人排隊(duì)時(shí),記下名單(EntryList)。
    • 有人出去喝咖啡時(shí),記在休息區(qū)(WaitSet)。
    • 支持“熟客”反復(fù)進(jìn)出(重入),還能喊人回來(notify)。

九、源碼分析補(bǔ)充

以下是 ObjectMonitor 的關(guān)鍵方法(偽代碼簡化版),進(jìn)一步說明邏輯:

// 獲取鎖
void ObjectMonitor::enter(Thread* self) {
  if (_owner == self) {
    _recursions++;
    return;
  }
  if (_owner == nullptr && Atomic::cmpxchg(self, &_owner, nullptr) == nullptr) {
    return;
  }
  add_to_entry_list(self);
  self->park();
}
// 釋放鎖
void ObjectMonitor::exit(Thread* self) {
  if (_recursions > 0) {
    _recursions--;
    return;
  }
  _owner = nullptr;
  if (_EntryList || _WaitSet) {
    notify_waiters();
  }
}
// 等待
void ObjectMonitor::wait(Thread* self, jlong millis) {
  _WaitSet->append(self);
  _recursions = 0;
  exit(self);
  self->park(millis);
}
// 喚醒
void ObjectMonitor::notify() {
  if (_WaitSet) {
    Thread* t = _WaitSet->remove_first();
    _EntryList->append(t);
    t->unpark();
  }
}

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

  • CAS:確保 _owner 設(shè)置的原子性。
  • park/unpark:依賴 LockSupport,底層調(diào)用操作系統(tǒng)調(diào)度。
  • 隊(duì)列管理ObjectWaiter 節(jié)點(diǎn)維護(hù) EntryList 和 WaitSet。

十、擴(kuò)展閱讀

  1. 源碼推薦
    • HotSpot JVM:objectMonitor.hpp 和 objectMonitor.cpp(Monitor 實(shí)現(xiàn))。
    • 相關(guān)文件:synchronizer.cpp(鎖狀態(tài)切換)、markOop.hpp(Mark Word)。
  2. 工具
    • 用 jstack 查看線程狀態(tài),分析 Monitor 競爭。
    • 用 JOL(Java Object Layout)查看對象頭和 Monitor 指針。
  3. 書籍
    • 《深入理解 Java 虛擬機(jī)》(周志明):講解 JVM 鎖和 Monitor 實(shí)現(xiàn)。
    • 《Java 并發(fā)編程實(shí)戰(zhàn)》:結(jié)合 synchronized 理解 Monitor。

到此這篇關(guān)于Java 的 Monitor 機(jī)制之從原理與源碼解讀的文章就介紹到這了,更多相關(guān)java monitor原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot HikariCP連接池監(jiān)控實(shí)現(xiàn)方案

    SpringBoot HikariCP連接池監(jiān)控實(shí)現(xiàn)方案

    文章介紹了五種監(jiān)控SpringBoot應(yīng)用程序中HikariCP連接池狀態(tài)和性能的工具和技術(shù),包括SpringBootActuator、Micrometer、Prometheus+Grafana、HikariCP自帶的Metrics以及NewRelic/Datadog等第三方服務(wù),每種方法都有其特點(diǎn)和配置步驟
    2025-01-01
  • Java中Console對象實(shí)例代碼

    Java中Console對象實(shí)例代碼

    這篇文章主要介紹了Java中Console對象實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • 解決IDEA 左側(cè)Project中沒有out文件夾的問題

    解決IDEA 左側(cè)Project中沒有out文件夾的問題

    這篇文章主要介紹了解決IDEA 左側(cè)Project中沒有out文件夾的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • zookeeper端口說明及介紹

    zookeeper端口說明及介紹

    這篇文章主要介紹了zookeeper端口說明,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-07-07
  • Intellij IDEA如何去掉@Autowired 注入警告的方法

    Intellij IDEA如何去掉@Autowired 注入警告的方法

    這篇文章主要介紹了Intellij IDEA如何去掉@Autowired 注入警告的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 詳解application.properties和application.yml文件的區(qū)別

    詳解application.properties和application.yml文件的區(qū)別

    這篇文章主要介紹了詳解application.properties和application.yml文件的區(qū)別,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • 詳解Java中String類型與默認(rèn)字符編碼

    詳解Java中String類型與默認(rèn)字符編碼

    這篇文章主要介紹了Java中String類型與默認(rèn)字符編碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • SWT(JFace) Wizard(Eclipse插件編程必備)

    SWT(JFace) Wizard(Eclipse插件編程必備)

    SWT(JFace)小制作:Wizard(Eclipse插件編程必備)
    2009-06-06
  • springboot+camunda實(shí)現(xiàn)工作流的流程分析

    springboot+camunda實(shí)現(xiàn)工作流的流程分析

    Camunda是基于Java語言,支持BPMN標(biāo)準(zhǔn)的工作流和流程自動(dòng)化框架,并且還支持CMMN規(guī)范,DMN規(guī)范,本文給大家介紹springboot+camunda實(shí)現(xiàn)工作流的流程分析,感興趣的朋友一起看看吧
    2021-12-12
  • Java面試最容易被刷的重難點(diǎn)之鎖的使用策略

    Java面試最容易被刷的重難點(diǎn)之鎖的使用策略

    鎖像synchronized同步塊一樣,是一種線程同步機(jī)制,但比Java中的synchronized同步塊更復(fù)雜。因?yàn)殒i(以及其它更高級的線程同步機(jī)制)是由synchronized同步塊的方式實(shí)現(xiàn)的,所以我們還不能完全擺脫synchronized關(guān)鍵字
    2021-10-10

最新評論

青田县| 内乡县| 高陵县| 兰考县| 武功县| 陈巴尔虎旗| 阿鲁科尔沁旗| 团风县| 连州市| 乌拉特中旗| 大安市| 江都市| 富阳市| 农安县| 永和县| 镇康县| 镇远县| 浏阳市| 内黄县| 鄂托克前旗| 保亭| 上思县| 邹城市| 安泽县| 龙里县| 石狮市| 新田县| 曲周县| 随州市| 海兴县| 武冈市| 江华| 昆明市| 沽源县| 营山县| 凌源市| 余江县| 华亭县| 新化县| 蒲城县| 连南|