psi-nos
psi-nos
Mam problem z ConcurrentModificationException w #java. Nie mogę wkleić całego kodu, więc pytanie na przykładowym kodzie. Czy tutaj jest jakakolwiek opcja wystąpienie tego wyjątku na obiekcie 'map'? Bo wydaje mi się, że nie, ale mogę czegoś nie rozumieć. Rozumiem to tak, że żaden wątek nie wejdzie do żadnego z tych dwóch bloków synchronized, jeżeli któryś z nich jest w tym samym czasie wykonywany przez inny wątek.
  • Najlepsze
  • Wszystkie komentarze
e.....r
e.....r
@psi-nos: 'this' != 'this', bo pierwszy this to anonimowy TimerTask, drugi, to Twoja klasa główna, to są 2 różne monitory, nic się nie synchronizuje, powinno być synchronized(Test.this) wewn. TimerTask.
e.....r
e.....r
@psi-nos: Twoje klasa dziedzicząca po TimerTask, to klasa anonimowa, jej nazwa to, jak sam podałeś 'Test$1' (zwróć uwagę na '$1'), nazwa klasy nadrzędnej to 'Test', to są różne instancje różnych klas, stąd oczywiście różne hashe.
psi-nos
psi-nos
psi-nos Autor
1
@elewarr: a ConcurrentModificationException dostawałem przez próbę usuwania elementu mapy wewnątrz pętli "foreach" na mapie. Jeszcze dużo nauki przede mną... ;)
psi-nos
psi-nos
psi-nos Autor
0
@interface: przy pełnym kodzie mam jeszcze jeden obiekt, którego używam w obu blokach i który potrzebuje synchronized
psi-nos
psi-nos
psi-nos Autor
0
@elewarr: no pewnie. Dzięki wielkie! ( ͡º ͜ʖ͡º)
psi-nos
psi-nos
psi-nos Autor
0
@elewarr: trochę zgłupiałem, bo sprawdziłem, że w timerze this.toString pokazuje, że jest klasy Test, ale z innym hashem. Zrobiłem taki kod, żeby to pokazać: [](https://pastebin.com/BW5LueFz)
Wynik:

Method: Test@1540e19d
Timer: Test$1@689751f
Timer + method: Test@1540e19d
Z tego co napisałeś zrozumiałem, że dla Timer (drugi wynik) powinna być klasa TimerTask, a jest Test i to jeszcze z innym hashem. Jak to możliwe jak istnieje jeden obiekt klasy Test?