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?
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?
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'?
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ć
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.
Za rzadko robię coś takiego. :/ Poradzcie proszę.
ten scheduler musi w takim razie miec synchronized na tym updacie ?
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ą
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.
Jest jeszcze Collections.synchronizedMap(m)
, ale wystarczy o tym wiedzieć tyle, że ConcurrentHashMap
jest nowsze i lepsze :) (ConcurrentHashMap vs Synchronized HashMap).