Potrzebuję twojej porady. Na wstępie chciałbym opisać wstępne warunki.Jednoczesna kolekcja do 50/50 odczyt/zapis
- mam pewne osoby trzeciej Java obiektów z domyślnie
java.lang.Object
„shashCode()
iequals()
realizacji. InterfejsComparable
nie jest zaimplementowany. Rozmiar jest nieistotny. - Potrzebuję przechowywać takie obiekty przez jakiś czas w pamięci. Będę czytać i pisać je z różnych wątków w stosunku 50/50 (około 50% czyta i 50% pisze).
- Kolejność obiektów nie jest ważna. Po prostu chcę mieć możliwość wzięcia jakiegoś przedmiotu ze sklepu, to wszystko. Z bierze mam na myśli zarówno uzyskać i usunąć w tym samym czasie.
- Oczywiście, chcę, aby działał tak szybko, jak to możliwe, przy najniższym zużyciu pamięci. Próbuję uniknąć wszelkich synchronizacji w moim kodzie.
Najpierw próbowałem samodzielnie rozwiązać ten problem. Od razu odrzuciłem kolekcje CopyOnWriteArray*
ze względu na duże zużycie pamięci. Czytałem, że lepiej używać ich w przypadku rzadkich zapisów. ConcurrentHashMap
w ogólnych apartamentach dla moich potrzeb, ale nie znalazłem sposobu, aby podjąć operacji atomowej bez synchronizacji. Zatrzymałem się z moim dochodzeniem w sprawie kolekcji ConcurrentSkipListSet
. Zawiera on metodę pollFirst
, która jest całkiem niezłym zbiorem dla obiektów z.
Zaimplementowałem moje rozwiązanie z ConcurrentSkipListSet
jako podstawę. Wszystko działa dobrze z wyjątkiem jednego małego szczegółu. Jak wspomniałem wyżej obiekty, z którymi pracuję, nie implementuję Comparable
. Aby użyć wybranej kolekcji, muszę w jakiś sposób wdrożyć Comparator
. Oto moja implementacja tego interfejsu. W tym przykładzie użyłem bezpośrednio java.lang.Object
zamiast mojego typu obiektów. Zrobiłem to, ponieważ implementacja jest całkowicie taka sama, różnica jest tylko w ogólnej części klasy.
import java.util.Comparator;
public class ObjectComparator implements Comparator<Object> {
public int compare(Object o1, Object o2) {
return o1.hashCode() - o2.hashCode();
}
}
Wady tej implementacji są oczywiste. Odkryłem, że jest tam no guarantee, że dwa różne obiekty będą miały różne kody skrótów. W takim przypadku można stracić niektóre przedmioty, które nie są akceptowane. Myślałem, aby zwrócić kilka liczb losowych w przypadku równych kodów mieszania dla różnych obiektów, ale nie jestem pewien, że nie złamie implementacji ConcurrentSkipListSet
.
W odniesieniu do opisanej sytuacji mam dwa ogólne pytania.
- Czy możliwe jest wdrożenie
Comparator
dla mojego obiektu w taki sposób, aby jak nie wrócić0
dla różnych obiektów i zachowaćConcurrentSkipListSet
funkcjonalności? - Czy istnieje inny sposób przechowywania moich obiektów?
Z góry dziękuję za odpowiedzi.
Jak duże są twoje przedmioty? Strategia CopyOnWrite jest najlepsza, jeśli masz <100 obiektów ze względu na ciężkość semaforu. A jeśli twoje kolekcje nie są zbyt duże, możesz dopasować wszystko do pokolenia Eden za pomocą bardzo wydajnego algorytmu. – Taky
@Taky Rozmiar kolekcji nie został określony. Może to być 100 lub 10k. Nie wiem Próbuję znaleźć jakiś ogólny sposób rozwiązania tego problemu. Również nie złapałem drugiej części twojego komentarza. Co masz na myśli mówiąc o "pokoleniu Eden"? – artspb
Przez "pokolenie Eden" mam na myśli młodą pulę obiektu JVM. – Taky