多執行緒 固定容量同步容器

2021-10-05 05:04:52 字數 1812 閱讀 3932

寫乙個固定容量同步容器,擁有put和get方法,以及getcount方法,

能夠支援2個生產者執行緒以及10個消費者執行緒的阻塞呼叫

使用wait和notify/notifyall來實現

注意countdownlatch.await() 不是 wait()方法

public class thread_consumer_provider_01  catch (exception e) 

}list.add(num);

count++;

this.notifyall();

}private synchronized integer get() catch (exception e)

}integer num = list.remove(0);

count--;

this.notifyall();

return num;

}public static void main(string args) catch (exception e)

}t.countdownlatch.countdown();

}).start();

}for (int i = 0; i < 2; i++) catch (exception e)

}t.countdownlatch.countdown();

}).start();

}try catch (exception e)

system.out.println("list size is :" + t.count);

}}

• condition conside = lock.newcondition() 可以建立乙個執行緒等待佇列分組

• provider.await() 讓這個執行緒誰在這個執行緒等待佇列裡面

• consumer.signalall() 喚醒這個佇列中的所有執行緒

public class thread_consumer_provider_02 

list.add(num);

count++;

consumer.signalall();

} catch (exception e) finally

}private integer get()

num = list.remove(0);

count--;

provider.signalall();

}catch (exception e)finally

return num;

}public static void main(string args) catch (exception e)

}t.countdownlatch.countdown();

}).start();

}for (int i = 0; i < 3; i++) catch (exception e)

}t.countdownlatch.countdown();

}).start();

}try catch (exception e)

system.out.println("list size is :" + t.count);

}}

兩種方法比較:

• synchronized 喚醒執行緒的方法有可能消費者喚醒消費者

• lock condition 可以喚醒指定佇列中的執行緒

• synchronized 悲觀鎖 鎖公升級 偏向鎖

• lock 樂觀鎖(cas 預期值 實際值 期望值 aba 加版本)

Java多執行緒之同步容器與併發容器

vector hashtable collections.synchronziedxx 基於hashtable,段segement,最大16個 把粒度分細,每個段有自己的鎖 共享變數用volatile關鍵字,第一時間獲得修改資料。從主記憶體讀取,不從工作記憶體讀取 jdk有兩種cow容器 copyo...

多執行緒(六) 同步類容器和併發類容器

如古老的vector hashtable。這些容器的同步功能其實都是有jdk的collections.synchronized 等工廠方法去建立的。其底層的機制無非就是用傳統的synchronized關鍵字對每個公用的方法都進行同步,使得每次只能有乙個執行緒訪問容器的狀態。這很明顯不滿足我們今天網際...

多執行緒同步

synchronized 物件 其中物件相當於乙個標誌 鎖 用於判斷 同步 塊 同步的前提必須是兩個或兩個以上的執行緒,且共用同乙個鎖 同步解決了多執行緒的安全問題 弊端 多執行緒需要判斷鎖,消耗了資源 同步函式 將synchronized放在函式名前面即可 即具有同步性質 使用的鎖是this 靜態...