Korzystanie z synchronizacji - 1

"Cześć, Amigo!"

„Tak, jestem tutaj, jestem tutaj”.

„Dzisiaj opowiem Ci o używaniu synchronizacji w praktyce.”

„Kiedy program ma wiele obiektów i wątków, często zdarza się, że wiele wątków pracuje jednocześnie z tym samym obiektem. W ten sposób wątki kolidują ze sobą”.

– Tak, już to wiem.

„Załóżmy więc, że masz dostęp do obiektu przez wiele wątków. Możesz zrobić dwie rzeczy, aby uniknąć problemów”.

„Pierwszym jest użycie zsynchronizowanych bloków do zawinięcia każdej lokalizacji, w której uzyskuje się dostęp do obiektu. Ale to podejście może nie zadziałać, jeśli jakiś programista napisze kod, który uzyskuje bezpośredni dostęp do obiektu, bez zsynchronizowanego bloku”.

„Dlatego przez większość czasu stosuje się drugie podejście — uczynienie obiektu bezpiecznym dla wątków”. „Innymi słowy, zsynchronizowany mechanizm jest wbudowany w sam obiekt: deklaruje, że jego metody są zsynchronizowane i/lub zawija kod wewnątrz swoich metod w zsynchronizowanych blokach”.

„Więc każdy obiekt, którego mogę użyć z wielu wątków, a to prawie wszystkie obiekty w programie, muszę zabezpieczyć wątkowo?”

„Ogólnie rzecz biorąc, tak. W rzeczywistości nie wszystkie obiekty w programie są używane przez różne wątki, ale zwykle jest ich dużo. Tak więc, kiedy zaczynasz pisać kod dla wątku i uzyskujesz z niego dostęp do różnych obiektów, to przy każdym wywołaniu metody powinieneś zadać sobie pytanie: „Czy to połączenie jest bezpieczne?”

"Bezpieczna?"

„Bezpieczny dla wątków, co oznacza, że ​​można go bezpiecznie wywoływać z wielu wątków”.

„Oto kilka przykładów. Załóżmy, że masz obiekt typu String, do którego dostęp uzyskuje się z różnych wątków. Jak już powinieneś pamiętać, obiekt typu String jest niezmienny — podobnie jak wszystkie inne typy pierwotne. Oznacza to, że obiekt nie zmienia się po utworzeniu Oznacza to, że niemożliwe jest „złamanie” takiego obiektu. Wszystkie niezmienne obiekty są bezpieczne dla wątków”.

– Cóż, to ułatwia sprawę.

„Załóżmy teraz, że potrzebujesz zmiennego łańcucha”.

„Tak, pamiętam. Istnieją dwa rodzaje takich łańcuchów: StringBuffer i StringBuilder. StringBuffer jest podobny do StringBuilder, ale wszystkie jego metody są zsynchronizowane. Czy jest również bezpieczny dla wątków?”

„Tak. Jeśli potrzebujesz uzyskać dostęp do obiektu StringBuilder z wielu wątków, musisz zastąpić go StringBufferem. W przeciwnym razie prędzej czy później wątki zmienią go w tym samym czasie i «złamią» go”.

„Co jeśli obiekt, do którego uzyskuje się dostęp z różnych wątków, jest obiektem mojej własnej klasy? Czy w tym przypadku również muszę dodać synchronized do jego metod?”

„Tak. Najlepiej kierować się tą zasadą: wszystkie obiekty, do których dostęp będzie uzyskiwany z różnych wątków, muszą być bezpieczne dla wątków”.

– Rozumiem. Nie sądziłem, że wszystko jest takie poważne. Dzięki, Ellie.

„Nie ma za co. Mam nadzieję, że te wskazówki pomogą ci, gdy Diego da ci kilka swoich łatwych zadań. ☺”