SynchronousQueue是一个没有容量的队列,它的put操做和take操做之间是相互依赖的,即put操做必须在take操做准备好时才能将元素“推”过去,反之take操做也必须在put操做准备推元素的时候才能获取到元素。有人可能会说只有1个容量大小的BlockingQueue也能实现该操做,可是它们之间有着本质的不一样:线程
一、SynchronousQueue在put时,若是另外一个线程没有执行take操做,put线程会一直阻塞;而BlockingQueue在put一个元素时,第一次是不会阻塞的,只有第二次由于容量满了put操做才阻塞,而SynchronousQueue在第一次就阻塞;队列
二、从第1点就能够看出SynchronousQueue容量为0,而BlockingQueue至少有容纳1个元素的空间。内存
应用场景:假设某资源从硬盘加载须要较长时间,并且资源会不按期的更新,一旦更新后在内存中会产生新的资源副本,老的资源必须及时释放,不然随着时间累积最终内存会溢出。资源
一、做为客户端在使用资源的时候是不可以每次打开资源而后在关闭的,那样致使频繁从硬盘加载并释放,虽然可以保证资源及时更新,可是效率低下。效率
二、容易想到的大概方法是系统在启动时加载资源,这样客户端能够保证能获取到资源,而后后台起一个线程按期从磁盘加载保证资源获得更新,同时发布出去使得客户端能获取到资源句柄,而且将老的资源关闭。可是关闭的时候又要保证客户端没有正在使用该资源,这是最关键的限制条件。先给出一种实现思路:后台
一、系统启动时预先加载资源,客户端在第一次获取资源时能够直接获取,避免了第一次加载所耗的时间。方法
二、新建一个更新线程从磁盘中加载资源并放入到SynchronousQueue中,此时因为客户端正在使用资源因而在第二次获取资源前更新线程会一直阻塞。这样的好处是:更新线程不会频繁从磁盘加载节约了资源,而且还保证了每次加载时,客户端能获取到最新一次加载的资源(可能包含更新,也可能只是新的副本)。客户端
三、当客户端第二次获取资源时,须要将原先的资源设置为老资源,并让更新线程去关闭。这样的好处是因为资源的释放多是耗时的,那么客户端能够快速获取资源。时间