原创 Java併發(二十三)----同步模式之保護性暫停

1、定義 即 Guarded Suspension,用在一個線程等待另一個線程的執行結果 要點 有一個結果需要從一個線程傳遞到另一個線程,讓他們關聯同一個 GuardedObject 如果有結果不斷從一個線程到另一個線程那麼可以使用

原创 Java併發(二十二)----wait notify的正確姿勢

開始之前先看看,sleep(long n) 和 wait(long n) 的區別: 1) sleep 是 Thread 的靜態方法,而 wait 是 Object 的方法 2) sleep 不需要強制和 synchronized 配合使用

原创 Java併發(二十一)----wait notify介紹

1、小故事 - 爲什麼需要 wait 由於條件不滿足(沒煙幹不了活啊,等小M把煙送過來),小南不能繼續進行計算 但小南如果一直佔用着鎖,其它人就得一直阻塞,效率太低 於是老王單開了一間休息室(調用 wait 方法),讓小南

原创 Java併發(二十)----synchronized原理進階

1、小故事 故事角色 老王 - JVM 小南 - 線程 小女 - 線程 房間 - 對象 房間門上 - 防盜鎖 - Monitor-重量級鎖 房間門上 - 小南書包 - 輕量級鎖 房間門上 - 刻上小南大名 - 偏

原创 Java併發(十九)----Monitor原理及Synchronized原理

1、Java 對象頭 以 32 位虛擬機爲例 普通對象 |--------------------------------------------------------------| |                     Objec

原创 Java併發(十八)----常見線程安全類及實例分析

1、常見線程安全類 String Integer StringBuffer Random Vector Hashtable java.util.concurrent (JUC)包下的類 這裏說它們是線程安全的

原创 Java併發(十七)----變量的線程安全分析

1、成員變量和靜態變量是否線程安全 如果它們沒有共享,則線程安全 如果它們被共享了,根據它們的狀態是否能夠改變,又分兩種情況 如果只有讀操作,則線程安全 如果有讀寫操作,則這段代碼是臨界區,需要考慮線程安全   2、

原创 Java併發(十六)----線程八鎖

所謂的“線程八鎖” 其實就是看 synchronized 鎖住的是哪個對象 情況1:12 或 21都是有可能的,就看cpu先調度哪個線程 @Slf4j(topic = "c.Number") class Number{    public

原创 Java併發(十五)----synchronized解決共享的問題

爲了避免臨界區的競態條件發生,有多種手段可以達到目的。 阻塞式的解決方案:synchronized,Lock 非阻塞式的解決方案:原子變量 此次介紹使用阻塞式的解決方案:synchronized,來解決上述問題,即俗稱的【對象鎖

原创 Java併發(十四)----悲觀互斥與樂觀重試

1. 悲觀互斥 互斥實際是悲觀鎖的思想 例如,有下面取款的需求 interface Account {    // 獲取餘額    Integer getBalance(); ​    // 取款    void withdraw(

原创 Java併發(十三)----共享存在的問題

1、小故事 老王(操作系統)有一個功能強大的算盤(CPU),現在想把它租出去,賺一點外快 小南、小女(不同的線程)來使用這個算盤來進行一些計算,並按照時間給老王支付費用 但小南不能一天24小時使用算盤,他經常要小憩一會(s

原创 Java併發(十二)----線程應用之多線程解決燒水泡茶問題

1、背景 統籌方法,是一種安排工作進程的數學方法。它的實用範圍極廣泛,在企業管理和基本建設中,以及關係複雜的科研項目的組織與管理中,都可以應用。 怎樣應用呢?主要是把工序安排好。 比如,想泡壺茶喝。當時的情況是:開水沒有;水壺要洗,茶壺、茶

原创 Java併發(十)----線程之守護線程

默認情況下,Java 進程需要等待所有線程都運行結束,纔會結束。有一種特殊的線程叫做守護線程,只要其它非守護線程運行結束了,即使守護線程的代碼沒有執行完,也會強制結束。 例: log.debug("開始運行..."); Thread t1

原创 Java併發(十一)----線程五種狀態與六種狀態

1、五種狀態 這是從 操作系統 層面來描述的 【初始狀態】僅是在語言層面創建了線程對象,還未與操作系統線程關聯 【可運行狀態】(就緒狀態)指該線程已經被創建(與操作系統線程關聯),可以由 CPU 調度執行 【運行狀態】指獲取了

原创 Java併發(八)----使用線程避免cpu佔用100%

1、sleep 實現 在沒有利用 cpu 來計算時,不要讓 while(true) 空轉浪費 cpu,這時可以使用 yield 或 sleep 來讓出 cpu 的使用權給其他程序 while(true) {    try {