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


相关推荐

  • 代码也浪漫——Python烟花秀[通俗易懂]

    代码也浪漫——Python烟花秀[通俗易懂]下午太困,无意中看到一段用Tkinter库写的放烟花的程序,就跟着跑了一遍。设计理念:通过让画面上一个粒子分裂为X数量的粒子来模拟爆炸效果。粒子会发生“膨胀”,意思是它们会以恒速移动且相互之间的角度相等。这样就能让我们以一个向外膨胀的圆圈形式模拟出烟花绽放的画面。经过一定时间后,粒子会进入“自由落体”阶段,也就是由于重力因素它们开始坠落到地面,仿若绽放后熄灭的烟花。 首先我们写一个粒子…

    2025年11月20日
    2
  • 图数据的自监督学习介绍

    图数据的自监督学习介绍深度学习在解决许多复杂的机器学习问题方面一直是一个有趣的课题,特别是最近在图数据方面。然而,大多数的解决方案要么是监督或半监督,高度依赖于数据中的标签,导致过拟合和整体鲁棒性较弱。自监督学习(Self-SupervisedLearning,SSL)是一种很有前途的解决方案,它从无标记数据中挖掘有用的信息,使其成为图数据领域中一个非常有趣的选择。为什么自监督学习更适合图形数据?SSL有助于理解图形数据中存在的结构和属性信息,使用标记数据时可能会忽略这些信息对于现实世界的数据,获取带标签的图形数据非常

    2025年11月14日
    4
  • 面试技巧|“唇枪舌剑”之十大招式[通俗易懂]

    面试技巧|“唇枪舌剑”之十大招式

    2022年2月15日
    34
  • 一起谈.NET技术,JAVA与.NET的相互调用——利用JNBridge桥接模式实现远程通讯

    一起谈.NET技术,JAVA与.NET的相互调用——利用JNBridge桥接模式实现远程通讯

    2021年8月13日
    43
  • golang2020激活码【在线破解激活】

    golang2020激活码【在线破解激活】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    57
  • 浏览器visibilitychange事件

    浏览器visibilitychange事件1.项目中,从一个页面进入到另一个页面,然后在这个页面做一些修改后返回到第一个页面,这个时候第一个页面没有刷新只类似tab切换,所以用户的修改未生效。使用html的浏览器事件visibilitychange2.此事件已经得到了广泛应用,但是一些老版本的浏览器需要加相应的前缀3.微信内置的浏览器因为没有标签,所以不会触发该事件手机端直接按Home键回到桌面,也不会触发该事…

    2022年6月29日
    34

发表回复

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

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