synchronousqueue场景_谈谈SynchronousQueue

synchronousqueue场景_谈谈SynchronousQueueSynchronousQueue是一个没有容量的队列,它的put操作和take操作之间是相互依赖的,即put操作必须在take操作准备好时才能将元素“推”过去,反之take操作也必须在put操作准备推元素的时候才能获取到元素。有人可能会说只有1个容量大小的BlockingQueue也能实现该操作,但是它们之间有着本质的不同:1、SynchronousQueue在put时,如果另一个线程没有执行ta…

大家好,又见面了,我是你们的朋友全栈君。

SynchronousQueue是一个没有容量的队列,它的put操作和take操作之间是相互依赖的,即put操作必须在take操作准备好时才能将元素“推”过去,反之take操作也必须在put操作准备推元素的时候才能获取到元素。有人可能会说只有1个容量大小的BlockingQueue也能实现该操作,但是它们之间有着本质的不同:

1、SynchronousQueue在put时,如果另一个线程没有执行take操作,put线程会一直阻塞;而BlockingQueue在put一个元素时,第一次是不会阻塞的,只有第二次因为容量满了put操作才阻塞,而SynchronousQueue在第一次就阻塞;

2、从第1点就可以看出SynchronousQueue容量为0,而BlockingQueue至少有容纳1个元素的空间。

应用场景:假设某资源从硬盘加载需要较长时间,而且资源会不定期的更新,一旦更新后在内存中会产生新的资源副本,老的资源必须及时释放,否则随着时间累积最终内存会溢出。

1、作为客户端在使用资源的时候是不能够每次打开资源然后在关闭的,那样导致频繁从硬盘加载并释放,虽然能够保证资源及时更新,但是效率低下。

2、容易想到的大概方法是系统在启动时加载资源,这样客户端可以保证能获取到资源,然后后台起一个线程定期从磁盘加载保证资源得到更新,同时发布出去使得客户端能获取到资源句柄,并且将老的资源关闭。但是关闭的时候又要保证客户端没有正在使用该资源,这是最关键的限制条件。先给出一种实现思路:

1、系统启动时预先加载资源,客户端在第一次获取资源时可以直接获取,避免了第一次加载所耗的时间。

2、新建一个更新线程从磁盘中加载资源并放入到SynchronousQueue中,此时由于客户端正在使用资源于是在第二次获取资源前更新线程会一直阻塞。这样的好处是:更新线程不会频繁从磁盘加载节约了资源,并且还保证了每次加载时,客户端能获取到最新一次加载的资源(可能包含更新,也可能只是新的副本)。

3、当客户端第二次获取资源时,需要将原先的资源设置为老资源,并让更新线程去关闭。这样的好处是由于资源的释放可能是耗时的,那么客户端可以快速获取资源。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152124.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 什么是单点登录?单点登录的三种实现方式「建议收藏」

    什么是单点登录?单点登录的三种实现方式「建议收藏」单点登录SSO(SingleSignOn)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。单点登录在大型网站里使用得非常频繁,例如像阿里巴巴这样的网站,在网站的背后是成百上千的子系统,用户一次操作或交易可能涉及到几十个子系统的协作,如果每个子系统都需要用户认证,不仅用户会疯掉,各子系统也会为这种重复认证授权的逻辑搞…

    2022年7月27日
    11
  • python专业版激活成功教程_Python社区版和专业版的差距

    python专业版激活成功教程_Python社区版和专业版的差距PyCharm是一种PythonIDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。PyCharm最常用的两个版本就是社区版和专业版,这两个版本区别如下:专业版和社区版的区别除了这两版本之外,还有一个版本就是教育版,这三个有什么区别呢?1.收费不同首先就是三者的收费不同:专业版是收费的,另外两个是免费的。2.功能不同pyCharm专业版是功能最丰富的,与社区版相比,PYc…

    2022年8月29日
    2
  • kafka批量删除topic_kafka自动创建topic

    kafka批量删除topic_kafka自动创建topic方法一:快速配置删除法1.kafka启动之前,在server.properties配置delete.topic.enable=true2.执行命令bin/kafka-topics.sh–delete–topictest–zookeeperzk:2181或者使用kafka-manager集群管理工具删除注意:如果kafka启动之前没有配置delete.topic.enab…

    2022年10月7日
    2
  • idea创建web项目没有webapp_为什么idea创建不了web项目

    idea创建web项目没有webapp_为什么idea创建不了web项目1、点击菜单栏File→ProjectStructure2、在Modules模块中,增加web配置3、设置web根目录和web.xml文件所在位置。自动生成的目录中,web改成src\main\webapp,如下图4、点击OK,效果如下图…

    2022年9月1日
    3
  • 因果推断学习笔记三——Uplift模型「建议收藏」

    因果推断学习笔记三——Uplift模型「建议收藏」一、Uplift模型因果推断在互联网界应用主要是基于Upliftmodel来预测额外收益提升ROI。Uplift模型帮助商家计算人群营销敏感度,驱动收益模拟预算和投放策略制定,促成营销推广效率的最大化。同时如何衡量和预测营销干预带来的“增量提升”,而不是把营销预算浪费在“本来就会转化”的那部分人身上,成为智能营销算法最重要的挑战。举个例子????:对用户A和用户B都投放广告,投放广告后用户A的CVR(转化量/点击量)为5%,用户B的CVR为4%,那么是否就给用户A投广告呢?仅从投放广告后的结果来看是这

    2025年5月23日
    5
  • 一个游戏是如何被设计和开发出来的[通俗易懂]

    一个游戏是如何被设计和开发出来的[通俗易懂]我在知乎回答“想要自己做一款游戏,需要学习哪些知识”下面简单列举了四个能力,分别是:程序、设计、美术、音乐。但是碍于篇幅限制,我并没有详细展开来说明每一项能力具体是如何发挥作用,以及发挥作用的形式和功效。如果在学习之前,我们对即将学习的东西一无所知的话,会导致学习中产生不小的迷茫感:不知道为何而学,不知道学了有什么作用,不知道该学习到什么程度。带着这样的迷茫去学习,会导致学习效率低下,容易受挫,甚…

    2022年5月27日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号