前段时间,做了个“双缓冲队列”,可是测试的效果就是不怎么明显,理论完全都在这里,可是就是看不到效果。

昨天在某某的提示下,终于意识到不该用阻塞队列,换成普通的List对象,这样效果就明显多啦~~

又重新写了一篇文档,如下

提出问题:为啥要有双缓冲队列?

引用09年9月《程序员》上的一句话:双缓冲队列就是冲着同步/互斥的开销来的。我们知道,在多个线程并发访问同一个资源的时候,需要特别注意线程的同步问题。稍稍不注意,哦活,程序结果不正确了。最经典的就是“银行取钱”的例子,想想,都跟现金挂上钩了,看来这真不容忽视。

今天我们要谈的不是如何去给资源加锁解锁来解决同步问题,今天的重点在于,如何将线程同步的开销降低到我们力所能及的程度。如果你觉得,你可以通过增加硬件资源来弥补程序开销,那么,你将不可能成为一个优秀的程序员。

进入正题,先引入一个例子,两个实体:一个是玩具工厂,它的工作就是不停地生产玩具;另外一个实体就是小孩,它的工作就是不停地从工厂拿玩具。小孩不可能直接到工厂去“拿”玩具吧?呵呵,妈妈是绝对不会放心的。所以,我们有一个“搬运工”,搬运工自然要具备“存放”的功能,不然他怎么将玩具带给小孩呢,是吧。所以,我们先将搬运工定义为一个List,用来存放工厂生产出来的玩具。

玩具类,定义一个玩具实体

public class Toy {

private

String name;

public

String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

生产玩具的玩具工厂,相当于生产者

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");

}

}

}

}

小孩取玩具,相当于消费者

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();

java 缓存队列_双缓冲队列的java实现相关推荐

  1. 服务器端利器--双缓冲队列

    http://rrsongzi-gmail-com.iteye.com/blog/696627 传统队列是生产者线程和消费者线程从同一个队列中存取数据,必然需要互斥访 问,在互相同步等待中浪费了宝贵的 ...

  2. java集合——队列和双端队列+优先级队列

    [0]README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java集合--队列和双端队列+优先级队列 的相关知识: 0.2) for full sou ...

  3. java双端队列工作密取,同步器皿、并发容器、阻塞队列、双端队列与工作密取...

    同步容器.并发容器.阻塞队列.双端队列与工作密取 在多线程的开发中经常会碰到数据的并发修改,并发存取,因此正确的使用不同的容器很关键,直接影响到数据的正确性.下面主要记录下三种重要的队列,以及一种非常 ...

  4. apriori算法c++实现_经典数据结构与算法(四):Python/C/C ++实现队列类型双端队列数据结构...

    前期文章点击这里: 经典数据结构与算法(一):Python/C/C ++实现堆栈和队列 双端队列或双端队列是一种队列,其中可以从前面或后面执行元素的插入和删除.因此,它不遵循FIFO规则(先进先出). ...

  5. 单向队列、双端队列、栈的模型实现

    引言 自己实现简单的队列.栈的逻辑结构. 队列都包含头和尾两个指针,简单的单向队列只能在一端(如:head端)入列,在另一端(如:tail 端)出列:双端队列可以在 head 进出,也可以在 tail ...

  6. 《恋上数据结构第1季》队列、双端队列、循环队列、循环双端队列

    队列(Queue) 队列 Queue 队列的接口设计 队列源码 双端队列 Deque 双端队列接口设计 双端队列源码 循环队列 Circle Queue 循环队列实现 索引映射封装 循环队列 – %运 ...

  7. 数据结构之队列、双端队列

    数据结构之队列.双端队列 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 队列是一种先进先出的(First in First Out)的线性表,简称FIFO.允许插入的 ...

  8. python数据结构与算法——栈、队列与双端队列

    栈 栈:是一种容器,可存入数据元素.访问元素.删除元素,它的特点在于只能允许在容器的一端进行加入数据和输出数据的运算.没有了位置概念,保证任何时候可以访问.删除的元素都是此前最后存入的那个元素,确定了 ...

  9. java队列_如何彻底搞懂 Java 数据结构?CSDN 博文精选

    作者 | 张振华.Jack 责编 | 郭芮 出品 | CSDN 博客 本文和大家一起来重温<Java数据结构>经典之作. Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? ...

  10. java 固定长度队列_如何彻底搞懂 Java 数据结构?|CSDN 博文精选

    作者 | 张振华.Jack 责编 | 郭芮 出品 | CSDN 博客 本文和大家一起来重温<Java数据结构>经典之作. Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? ...

最新文章

  1. 如何打造一个经常宕机的业务系统?
  2. 黄聪:Wordpress 模版技术手册 - WordPress Theme Technical manuals
  3. 学习deercao的正则笔记
  4. 影响u盘传输速度和使用寿命的几大因素
  5. 函数指针声明时的形参列表可以没有
  6. [翻译]用于.NET Core的Windows窗体设计器发布
  7. 都在讲Redis主从复制原理,我来讲实践总结
  8. Android开发笔记(三十二)文件基础操作
  9. printf如何消后续0_Hello World背后的故事:如何在Linux上编译C语言程序
  10. Ubuntu系统下载(清华大学开源软件镜像站)(ubuntu-20.04.1-desktop-amd64.iso)
  11. 微信开发之小程序UI设计规范
  12. Netty高级进阶之基于Netty的Websocket开发网页聊天室
  13. 安卓篇-我自己的第一个安卓程序(附源码链接)
  14. ccf化学方程式配平检验
  15. 鸡头稳如云台_稳如“鸡头”?魔爪Mini-MI智能手机三轴稳定器 开箱
  16. ubuntu如何安装java jdk,Ubuntu下安装JDK图文详解
  17. 《仙剑奇侠传3》仙术合集
  18. Unity ACT游戏相机逻辑
  19. [Java8]_[增强功能]_[Base64编解码]
  20. 智邦亮相2019上海MWC, 为下一代移动、住宅和企业服务的云应用奠定基石

热门文章

  1. HTML5期末大作业:运动系列——NBA篮球主题学生网页设计(7个页面) HTML+CSS+JavaScript 体育网页设计HTML代码 学生网页课程设计期末作业下载 大学生网页设计制作成...
  2. 使用UniWebView时的内存管理
  3. JavaWeb笔记 黑马程序员课程
  4. 即时通讯视频聊天原理是什么
  5. 数字集成电路与系统设计基础知识
  6. 计算机三级数据库技术 知识点
  7. 泛微OA “低代码“开发-流程表单
  8. 无法实现的梦想:孤独之旅计划
  9. qml实现高德地图(2)
  10. 推荐一个好用的百度文库在线免费下载文档网站