寫乙個固定容量同步容器,擁有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 靜態...