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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java后台登录注册管理系统

    Java后台登录注册管理系统转载请注明出处:https://blog.csdn.net/binbinqq86/article/details/81746294项目简介环境搭建ide的选择数据库相关tomcat相关开始JDBC封装DAO封装Junit编写jsp编写servlet编写运行结果写在最后项目简介本文是笔者自己学习后台开发打响的第一枪,也是后台开发最基础的了,记得刚毕业的时候做过一个web项目,一直到今天都没有再了解过这方面,如今重新拾起,感觉还是需要多了解一些后端的东西,如果一直停留在移动端和前

    2022年4月25日
    53
  • CSDN有哪些值得学习的专栏?

    CSDN有哪些值得学习的专栏?马上2020年了,回顾2019这一年,CSDN哪些专栏受到了大家的喜爱呢?我们结合专栏的关注量、浏览量、用户反馈等多个方面,精选出一些专栏,分期分类推荐给你!涉及各类领域,带你从入门进阶实战!目录一、Java二、Python新三、C/C++四、AI五、OpenCV六、SpringBoot七、GO新八、其他新一、Java1、Java程序…

    2022年9月1日
    4
  • 计算机应用网线接口亮红灯,网线插在电脑上网口灯不亮是为什么?

    计算机应用网线接口亮红灯,网线插在电脑上网口灯不亮是为什么?1、网线插在电脑上网口灯不亮,应该是接触不良。2、如有你已经把上网的网线,插在了路由器的WAN口,但是WAN口指示灯仍然不亮。这时候,请检查以下几个方面的问题:检查网线是否插好,网线是否有问题。3、如果确认网线没有松动,已经插好了;但是,WAN口指示灯还是不亮的话。那么,就有可能是插在路由器WAN口的网线有问题,导致路由器WAN口检测不到信号,所以路由器WAN口指示灯不亮。4、建议大家尽量使用质量…

    2022年6月26日
    125
  • Modelsim 10.2c 百度网盘下载「建议收藏」

    Modelsim 10.2c 百度网盘下载「建议收藏」百度网盘链接:链接:https://pan.baidu.com/s/1CGNg1Dy_S37P-obHoCncFg提取码:2eml

    2022年5月10日
    49
  • windows tasklist不能用

    windows tasklist不能用我的方法是在cmd下切换到C:\Windows\System32目录下,然后再tasklist

    2022年5月3日
    47
  • docker-jenkins部署cmake自动构建[通俗易懂]

    docker-jenkins部署cmake自动构建[通俗易懂]docker部署jenkins具体部署参考链接dockerrun-itd-p8080:8080-p50000:50000–namejenkins–privileged=true-v/var/jenkins_home:/var/jenkins_homejenkins/jenkins工程配置源码管理:添加git地址通过URL访问触发构建构建脚本这里的$WORKSPACE对应docker映射到本地的目录/var/jenkins_home/workspace/te

    2022年6月1日
    142

发表回复

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

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