Korzystanie z jednej mapy na wielu wątkach

0

Mam aktualnie taki problem, że mam w kodzie mapę z której będzie korzystać wiele wątków (na zasadzie pobierz klucz, zmodyfikuj wartość).

Jak to rozwiązać by nie było problemów z zakleszczaniem i innymi problemami?

0
Shalom napisał(a):

https://docs.oracle.com/javas[...]urrent/ConcurrentHashMap.html

Czy jak np. W Springu mam tą mape jako pole wi beanie typu singleton i modyfikuje ją requestami i rowniez jakims schedulerem i w obrębie klasy przekazuje ją do metod jako argument, to czy na pewno to wszystko jest 'bezpieczne'?

0

To zależy, jeżeli potrzebujesz dostępu do pojedynczego elementu mapy to concurrent hash mapa starczy, jeżeli np. potrzebujesz dostępu do całej mapy żeby ją przeiterować z pewnością, że nikt do niej nic nie włoży ani z niej nic nie wyjmie to musisz się synchronizować

0
  1. Sugeruję najpierw poczytanie o tym wielowątkowości w Javie
  2. Po 2 jest w dokumentacji jest wszystko napisane
0

To zależy co rozumiemy przez "bezpieczna". Na pewno się nie wywali, ale jej działanie jest specyficzne i trzeba to rozumieć. Operacje na tej mapie odzwierciedlają "aktualny" stan, który może się zmieniać w trakcie wykonywania operacji.

0

Za rzadko robię coś takiego. :/ Poradzcie proszę.

  1. Jest sobie klasa, która jest beanem typu singleton
  2. W tej klasie jest obsłużona logika CRUDa, który działa sobie na tej mapie
  3. Dodatkowo jest scheduler, który co parę minut updatuje to co znajduje się w tej mapie

ten scheduler musi w takim razie miec synchronized na tym updacie ?

1

Z tego co piszesz, raczej nie i CHM ci starczy. Po krótce CHM jest spoko, jeżeli chcesz pobrać dany obiekt z mapy lub go tam włożyć. Np. sprawdzasz czy masz w keszu taką, a taką wartość, a jak nie to ją wrzucasz - spoko. CHM nie jest dobrym rozwiązaniem gdy potrzebujesz pełnej synchronizacji, bo np. liczysz aktualny stan wpłat przez klientów - wtedy musisz się synchronizować, bo nie będziesz miał poprawnego wyniku gdy obliczysz 10 wpłat, a ktoś w tym czasie popełnił jedenastą

0
hcubyc napisał(a):

Z tego co piszesz, raczej nie i CHM ci starczy. Po krótce CHM jest spoko, jeżeli chcesz pobrać dany obiekt z mapy lub go tam włożyć. Np. sprawdzasz czy masz w keszu taką, a taką wartość, a jak nie to ją wrzucasz - spoko. CHM nie jest dobrym rozwiązaniem gdy potrzebujesz pełnej synchronizacji, bo np. liczysz aktualny stan wpłat przez klientów - wtedy musisz się synchronizować, bo nie będziesz miał poprawnego wyniku gdy obliczysz 10 wpłat, a ktoś w tym czasie popełnił jedenastą

Podczas tego schedulowanego updatu sprawdzana jestt LocalDateTime w zapisanych obiektach i sprawdzane z warunkiem "czy już nadaje się do updatu" .
Gdyby czasem coś się "nie załapało" na update to nie widziałbym w tym szczególnego problemu bo wpadnie następnym razem...

ale wydaje mi się, że powinno działać ok.

0

Jest jeszcze Collections.synchronizedMap(m), ale wystarczy o tym wiedzieć tyle, że ConcurrentHashMap jest nowsze i lepsze :) (ConcurrentHashMap vs Synchronized HashMap).

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0