2010-10-26 10 views

Odpowiedz

5

Rozmiar ConcurrentLinkedQueue jest nieograniczony, więc jeśli producenci wprowadzają elementy szybciej niż konsumenci mogą je usunąć, w końcu rzeczywiście pochłonie pamięć. Jeśli chcesz ograniczyć rozmiar kolejki, spróbuj zamiast tego kolejki blokującej, takiej jak LinkedBlockingQueue lub ArrayBlockingQueue. Rozmiar pierwszego może być opcjonalnie ograniczony, podczas gdy drugi jest zawsze ograniczony.

+0

Dziękuję za odpowiedź, ale użyłem ConcurrentLinkedQueue, ponieważ jest to współbieżne. Czy sugerujesz niezwiązane klasy, które będą wymagały dodania synchronizacji podczas uzyskiwania dostępu do tych zmiennych? – Youval

+1

@Można wykonać wszystkie implementacje 'BlockingQueue' w sposób bezpieczny dla wątków, jak zadeklarowano w [dokumentacji API] (http://download.oracle.com/javase/6/docs/api/java/util/concurrent/BlockingQueue.html). –

+0

Jednak blokowanie wątku może mieć wpływ na ogólną wydajność aplikacji w bardzo równoczesnych aplikacjach. Są więc wady i zalety. –

0

Trochę się spóźniam na tę, ale zawsze możesz ustawić górną granicę, a po jej przekroczeniu twoja metoda zużyje jeden żeton, aby zrobić miejsce na następną i tak dalej.