Java:双缓冲队列

这篇具有很好参考价值的文章主要介绍了Java:双缓冲队列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

@Data
public class Toy {

    private String name;

}

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

public class Factory extends Thread {
    public void run() {
        while (true) {
            Toy toy = new Toy();
            toy.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");
            }
        }
    }
}

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

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 >> 

public class DoubleBufferList {
	
	private List<Object> lp;
	private List<Object> 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();

						}
					}
				}
			}
		};
		Thread thread = new Thread(runner);
		thread.start();
	}
}

运行的主线程类 >> 

public class BaseTest {
	
	public static void main(String[] args) {
		Factory f = new Factory();
		f.start();
		Kid k = new Kid();
		k.start();
		new DoubleBufferList(Tools.lp, Tools.lt, 1).check();
	}
	
}

运行结果:比用一个List的生产者消费者模型快很多.大家可以测试下运行速度根据自己的实际情况进行使用文章来源地址https://www.toymoban.com/news/detail-793855.html

到了这里,关于Java:双缓冲队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java -- 缓冲流、转换流、序列化流

    缓冲流, 也叫高效流, 按照数据类型分类: 字节缓冲流 : BufferedInputStream , BufferedOutputStream 字符缓冲流 : BufferedReader , BufferedWriter 缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。

    2023年04月19日
    浏览(34)
  • Java IO流 - 缓冲流的详细使用介绍

    缓冲流概述 缓冲流介绍 : 缓冲流也称为高效流、或者高级流。之前学习的字节流和字符流可以称为原始流。 作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能 缓冲流分为: 字节缓存输入流、字节缓冲输出流、字符缓冲输入流、字符缓冲输出流 字节缓冲

    2024年02月01日
    浏览(35)
  • Java IO流 flush()的作用和缓冲流

    哪些流是缓冲流 根据Java官方文档关于Buffered Streams的介绍,缓冲流有四种: BufferedInputStream:包装字节输入流 BufferedOutputStream:包装字节输出流 BufferedReader:包装字符输入流 BufferedWriter:包装字符输出流 这些流又被称为包装流/处理流,用于包装非缓冲的流 There are four buffere

    2024年02月04日
    浏览(33)
  • java利用缓冲区及流式对大文件进行高效读写

    当处理大文件时,使用适当的技术和方法可以提高读写性能和效率。下面是一些针对大文件读写的示例说明: 字符流 缓冲区及分块读写  BufferedInputStream 和 BufferedOutputStream 大文件读取: try (FileInputStream fis = new FileInputStream(\\\"largefile.txt\\\");      BufferedInputStream bis = new BufferedInp

    2024年02月07日
    浏览(41)
  • 开发语言漫谈-Java

            由于C++过于复杂,Java诞生了。与C++相比,Java更易于学习和使用,它去掉C++中的指针和解决了内存管理问题。Java提供了垃圾自动回收机制,自动管理不再使用的内存。Python又进一步简化,使得语法更简洁,更易于阅读和编写。当然随着简化,性能就越来越低。    

    2024年04月10日
    浏览(49)
  • 海康威视相机SDK二次开发(JAVA语言)

    前言 有个项目需要使用java程序读取海康威视的相机图片。相机通过以太网连接服务器,部署在服务器上的java程序将相机拍摄的画面保存在指定路径下。 海康威视提供了sdk开发包,可以在官网中下载,windows和linux系统都有。但是开发包中给出的示例代码,无法满足实际需要,

    2024年04月29日
    浏览(51)
  • 【Java】后端开发语言Java和C#,两者对比注解和属性的区别以及作用

    欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《Java》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。 温馨提示:博主能力有限,理解水平有限

    2024年01月16日
    浏览(53)
  • BsinCopilot:Java版端到端大语言模型开发框架

    BsinCopilot是基于BsinPaaS开源框架构建的大语言模型应用SaaS服务,借鉴langchain的框架思想,引入  langchian4j组件,微前端微服务的架构设计,可快速助您构建和体验端到端的AI应用。 概念 说明 Bsin 毕昇缩写,毕昇,中国北宋发明家,活字印刷术的发明者。毕昇出身平民,长期在

    2024年03月13日
    浏览(61)
  • Android 安卓开发语言kotlin与Java该如何选择

            如今在Android开发中,应用层开发语言主要是Java和Kotlin,Kotlin是后来加入的,主导的语言还是Java。kotlin的加入仿佛让会kotlin语言的开发者更屌一些,其实不然。         有人说kotlin的引入是解决开发者复杂的逻辑,并且对空指针控制的比较友好,但是我们在开

    2024年02月11日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包