java 缓存队列_双缓冲队列的java实现
前段時間,做了個“雙緩沖隊列”,可是測試的效果就是不怎么明顯,理論完全都在這里,可是就是看不到效果。
昨天在某某的提示下,終于意識到不該用阻塞隊列,換成普通的List對象,這樣效果就明顯多啦~~
又重新寫了一篇文檔,如下
提出問題:為啥要有雙緩沖隊列?
引用09年9月《程序員》上的一句話:雙緩沖隊列就是沖著同步/互斥的開銷來的。我們知道,在多個線程并發(fā)訪問同一個資源的時候,需要特別注意線程的同步問題。稍稍不注意,哦活,程序結(jié)果不正確了。最經(jīng)典的就是“銀行取錢”的例子,想想,都跟現(xiàn)金掛上鉤了,看來這真不容忽視。
今天我們要談的不是如何去給資源加鎖解鎖來解決同步問題,今天的重點在于,如何將線程同步的開銷降低到我們力所能及的程度。如果你覺得,你可以通過增加硬件資源來彌補程序開銷,那么,你將不可能成為一個優(yōu)秀的程序員。
進入正題,先引入一個例子,兩個實體:一個是玩具工廠,它的工作就是不停地生產(chǎn)玩具;另外一個實體就是小孩,它的工作就是不停地從工廠拿玩具。小孩不可能直接到工廠去“拿”玩具吧?呵呵,媽媽是絕對不會放心的。所以,我們有一個“搬運工”,搬運工自然要具備“存放”的功能,不然他怎么將玩具帶給小孩呢,是吧。所以,我們先將搬運工定義為一個List,用來存放工廠生產(chǎn)出來的玩具。
玩具類,定義一個玩具實體
public class Toy {
private
String name;
public
String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
生產(chǎn)玩具的玩具工廠,相當(dāng)于生產(chǎn)者
package twoBufferQueue;
public class Factory extends Thread {
public void run() {
while (true) {
Toy t =
new Toy();
t.setName("玩具");
synchronized
(Tools.lP) {
if
(Tools.lP.size() >= 2000) {
try
{
Tools.lP.wait();
}
catch (Exception e) {
//
TODO: handle exception
}
}
Tools.lP.add(t);
//?System.out.println("put
one");
}
}
}
}
小孩取玩具,相當(dāng)于消費者
package twoBufferQueue;
public class Kid extends Thread {
long time1 = System.currentTimeMillis();
int count = 0;
public void run() {
while (true) {
synchronized
(Tools.lT) {
if
(Tools.lT.size() != 0){
Tools.lT.remove(0);
count++;
}
}
if (count ==
100000) {
System.out.println("time:"
+ (System.currentTimeMillis() - time1));
System.exit(0);
}
}
}
}
雙緩沖隊列,里面有兩個List
package twoBufferQueue;
import java.util.List;
public class DoubleBufferList {
private
List lP;
private
List lT;
private int
gap;
public
DoubleBufferList(List lP, List lT, int gap) {
this.lP = lP;
this.lT = lT;
this.gap = gap;
}
public
void check() {
Runnable runner = new Runnable() {
public void run() {
while (true) {
if (lT.size() == 0) {
synchronized (lT) {
synchronized (lP) {
lT.addAll(lP);
lP.notifyAll();
}
lP.clear();
總結(jié)
以上是生活随笔為你收集整理的java 缓存队列_双缓冲队列的java实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 总结一年来的前端学习心得
- 下一篇: 开发模式下浏览器不支持ES6