談談SynchronousQueue

SynchronousQueue是一個沒有容量的隊列,它的put操做和take操做之間是相互依賴的,即put操做必須在take操做準備好時才能將元素「推」過去,反之take操做也必須在put操做準備推元素的時候才能獲取到元素。有人可能會說只有1個容量大小的BlockingQueue也能實現該操做,可是它們之間有着本質的不一樣線程

一、SynchronousQueue在put時,若是另外一個線程沒有執行take操做,put線程會一直阻塞;而BlockingQueue在put一個元素時,第一次是不會阻塞的,只有第二次由於容量滿了put操做才阻塞,而SynchronousQueue在第一次就阻塞;隊列

二、從第1點就能夠看出SynchronousQueue容量爲0,而BlockingQueue至少有容納1個元素的空間。內存

應用場景:假設某資源從硬盤加載須要較長時間,並且資源會不按期的更新,一旦更新後在內存中會產生新的資源副本,老的資源必須及時釋放,不然隨着時間累積最終內存會溢出。資源

一、做爲客戶端在使用資源的時候是不可以每次打開資源而後在關閉的,那樣致使頻繁從硬盤加載並釋放,雖然可以保證資源及時更新,可是效率低下。效率

二、容易想到的大概方法是系統在啓動時加載資源,這樣客戶端能夠保證能獲取到資源,而後後臺起一個線程按期從磁盤加載保證資源獲得更新,同時發佈出去使得客戶端能獲取到資源句柄,而且將老的資源關閉。可是關閉的時候又要保證客戶端沒有正在使用該資源,這是最關鍵的限制條件。先給出一種實現思路:後臺

一、系統啓動時預先加載資源,客戶端在第一次獲取資源時能夠直接獲取,避免了第一次加載所耗的時間。方法

二、新建一個更新線程從磁盤中加載資源並放入到SynchronousQueue中,此時因爲客戶端正在使用資源因而在第二次獲取資源前更新線程會一直阻塞。這樣的好處是:更新線程不會頻繁從磁盤加載節約了資源,而且還保證了每次加載時,客戶端能獲取到最新一次加載的資源(可能包含更新,也可能只是新的副本)。客戶端

三、當客戶端第二次獲取資源時,須要將原先的資源設置爲老資源,並讓更新線程去關閉。這樣的好處是因爲資源的釋放多是耗時的,那麼客戶端能夠快速獲取資源。時間

相關文章
相關標籤/搜索