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


相关推荐

  • linux通配符的用法_linux中rmdir命令

    linux通配符的用法_linux中rmdir命令注意:linux通配符和三剑客(grep,awk,sed)正则表达式是不一样的,因此,代表的意义也是有较大区别的。通配符一般用户命令行bash环境,而linux正则表达式用于grep,sed,awk场景。*:通配符,代表所有(0到多个)字符?:通配符,代表任意1个字符;:连续不同命令的分隔符#:配置文件注释|:管道~:当前用户的家目录-:上一次所在的路径$:变量前需要加的符号/:路径分隔符号,也是…

    2026年1月23日
    3
  • linux 查看磁盘空间占用情况

    linux 查看磁盘空间占用情况

    2021年10月29日
    45
  • MPLS 虚拟专用网 实验配置和抓包

    MPLS 虚拟专用网 实验配置和抓包

    2021年4月14日
    194
  • 等价类划分法设计测试用例例题_有效等价类测试用例

    等价类划分法设计测试用例例题_有效等价类测试用例等价类划分法设计测试用例

    2022年10月18日
    3
  • 漫谈数据仓库之拉链表(原理、设计以及在Hive中的实现)

    漫谈数据仓库之拉链表(原理、设计以及在Hive中的实现)0x00前言本文将会谈一谈在数据仓库中拉链表相关的内容,包括它的原理、设计、以及在我们大数据场景下的实现方式。全文由下面几个部分组成:先分享一下拉链表的用途、什么是拉链表。通过一些小的使用场景来对拉链表做近一步的阐释,以及拉链表和常用的切片表的区别。举一个具体的应用场景,来设计并实现一份拉链表,最后并通过一些例子说明如何使用我们设计的这张表(因为现在Hive的大规模使用

    2022年10月17日
    3
  • Java遍历Map效率对比

    Java遍历Map效率对比Java中Map容器的遍历有多种方式,但是不同的方式效率会大有不同,以前没有注意这些细节,随意使用遍历方式在本地可能没有什么影响,但是在项目在高频使用需要特别注意,尽量使用高效的方式。首先,Map.Entry<K,V>是可以包含了Key和Value的,keySet包含了所有的Key,再使用get方法可以拿到对应的Value;所以包含Key和Value内容…

    2022年4月7日
    65

发表回复

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

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