Poprawne zsynchronizowanie metody.

Poprawne zsynchronizowanie metody.
SK
  • Rejestracja:około 12 lat
  • Ostatnio:około miesiąc
  • Postów:133
0

Witam, czytam o synchronizacji i naszła mnie myśl na mały program.

Otóż załóżmy że mamy klasę

Account:

  • saldo
  • getSaldo()
  • withdraw(amount)
  • add(amount)

BankOperation:
+transfer(Account from,Account to,double amount)

I będziemy z nich korzystać w taki sposób, że na cały system mamy wiele obiektów Account i jeden obiekt typu BankOperation, który zajmuje się przelewaniem środków.

Załóżmy, ze mamy interfejs który wywołuje zdarzenia przelewania pieniędzy pomiędzy danymi kontami. I teraz jeżeli ktoś by wywołał operacje (A,B) i w tym samym czasie ktoś inny (B,C) to następuje dostęp do B przez 2 wątki. I tu trzeba zastosować blokowanie,warunki -> synchronizacji. I tu pojawia się moje pytanie, czy wystarczy zalożyć synchro na metode BankOperation:transfer?

katelx
  • Rejestracja:około 10 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Hong Kong
0

jesli stan obiektow Account jest zmieniany tylko w metodzie transfer to tak, wystarczy

SK
  • Rejestracja:około 12 lat
  • Ostatnio:około miesiąc
  • Postów:133
0

Gdyby istniał drugi obiekt klasy BankOperation i tez wykonywał transfer to wtedy już nie da nam to bezpieczeństwa?

edytowany 1x, ostatnio: skytrack
katelx
  • Rejestracja:około 10 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Hong Kong
1

musialbys synchronizacje oprzec na tym samym lock'u

niezdecydowany
niezdecydowany
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 9 lat
  • Lokalizacja:Bieszczady
0

Pamiętam że nie tylko dostęp powinien być synchronizowany - czytanie także - bo synchronized to nie tylko lock który gwarantuje dostęp tylko z jednego wątku - ale też gwarantuje ci że zapis do zmiennej widocznej dla innych wątków, będzie dla nich "aktualny". także czytanie też musi być synchronizowane.


"Perhaps surprisingly, concurrent programming isn’t so much about threads or
locks, any more than civil engineering is about rivets and I-beams."
0

Badz volatile - jesli to tylko getter zmiennej, to wystarczy, nie trzeba synchronizowac.

niezdecydowany
niezdecydowany
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 9 lat
  • Lokalizacja:Bieszczady
0

Jasne, także prawidłowe podejście - ale jeżeli tych czytań nie ma tak dużo - brak cacha przez volotile może być rekompensowany właśnie przez synchronizowany getter


"Perhaps surprisingly, concurrent programming isn’t so much about threads or
locks, any more than civil engineering is about rivets and I-beams."
0

Czytalem kiedys ze od Javy 5 i nowego memory model nie ma wielkiej roznicy miedzy volatile i synchronized. Wczesniej mowilo sie ze volatile jest szybsze bo nie wymaga brania monitora itp. ale od jdk5 sie wyrownalo. Z doswiadczenia jednak wiem, ze ludzie nie wiedza co to volatile, wiec chcialem dac wskazowke.

niezdecydowany
niezdecydowany
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 9 lat
  • Lokalizacja:Bieszczady
0

Czekaj czekaj - **volotile **i **synchronized **to ZUPEŁNIE dwie różne rzeczy - mają tylko jedną wspólną cechę - oba zawiązują z wywołującym happens-before-relationship - i to właśnie skutuję widocznością i brakiem stale-data.

JDK nie ma tu za wiele do rzeczy, bo np: JMM, zależy od procesora, systemu - czyli jakie bariery znajdują się pod spodem.


"Perhaps surprisingly, concurrent programming isn’t so much about threads or
locks, any more than civil engineering is about rivets and I-beams."

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.