Cześć wszystkim,
Muszę wrzucać coś do sesji, ale jak użytkownik (per sesja) będzie szybko klikał to wystąpi u mnie typowy race condtion i część danych może się zgubić. Najlepszy lock w takiej sytuacji to lock 'per id sesji'.
Przykładowy serwis:
public class MyService {
private SessionService sessionService;
public void doSomething() {
synchronized ((SessionService.class.getSimpleName() + sessionService.getSessionId()).intern()) {
sessionService.rememberSomeData();
}
}
}
(SessionService.class.getSimpleName() + sessionService.getSessionId()) = unikalny lock na dany serwis i sesję użytkownika.
(SessionService.class.getSimpleName() + sessionService.getSessionId()).intern() - gwarantuje, że jest zawsze zwracana ta sama referencja.
Naczytałem się, że nie powinno używać stringów jako locka, pytanie jak inaczej powinienem rozwiązać ten problem? Ilość użytkowników w system jest dosyć duża, czyli liczba locków może być dosyć duża. Sam zapis danych w sesji jest szybką akcją. Ważne, aby użytkownik nie zgubił danych trzymanych sesji.
Pytanie czy da się to zrobić lepiej?