Synchronizacja w Javie: co, jak i dlaczego?



Ten artykuł na temat synchronizacji w Javie pomoże Ci nauczyć się synchronizowania programów wielowątkowych.

Programy wielowątkowe mogą regularnie pojawiać się w sytuacji, w której jest wiele próbować dotrzeć do tego samego zasobu, co daje oszukańcze i zaskakujące wyniki. Można to rozwiązać za pomocą synchronizacji w Javie. Tylko jeden konkretny wątek może dostać się do zasobu w określonym czasie. Ten artykuł pomoże Ci zapoznać się ze strategią synchronizacji.

Będę omawiać tematy w następującej kolejności:





Zacznijmy!

Dlaczego warto korzystać z synchronizacji w Javie?



Jeśli zaczniesz od co najmniej dwóch wątków w programie, może wystąpić szansa, że ​​wiele wątków spróbuje uzyskać dostęp do tego samego zasobu. Może nawet spowodować nieoczekiwany wynik z powodu problemów ze współbieżnością.

Składnia :

synchronized (objectidentifier) ​​{// Dostęp do wspólnych zmiennych i innych udostępnionych zasobów}

Na przykład, próbować pisać w równoważnym pliku. Może to spowodować uszkodzenie danych, ponieważ jeden z wątków może przesłonić dane lub gdy wątek otwiera plikten sam plik w tym samym czasie, inny wątek może zamykać ten sam plik.Istnieje potrzeba synchronizacji działania wielu wątków. Można to zrealizować za pomocą koncepcji o nazwie M onitorów .



  • Każdy jest powiązany z monitorem, którego wątek może blokować lub odblokowywać.
  • Tylko jeden wątek naraz może blokować monitor.
  • Jawa język programowania zapewnia bardzo wygodny sposób tworzenia wątków i synchronizowania ich zadań za pomocą Zsynchronizowane Bloki.
  • Zachowuje również współdzielone zasoby w tym konkretnym bloku.

Zsynchronizowane bloki w Javie są oznaczone Zsynchronizowane słowo kluczowe. Ten blok w Javie jest zsynchronizowany z jakimś obiektem.Wszystkie bloki, które są zsynchronizowane na tym samym obiekcie, mogą mieć jednocześnie wykonywany w nich tylko jeden wątek. Wszystkie inne wątki próbujące wejść do zsynchronizowanego bloku są blokowane, dopóki wątek wewnątrz zsynchronizowanego bloku nie opuści bloku.

Rodzaje synchronizacji

Istnieją zasadniczo dwa rodzaje synchronizacji. Oni są:

  1. Synchronizacja procesów: Jednoczesne wykonywanie wielu wątków lub procesów w celu osiągnięcia takiego stanu, że zobowiązują się do wykonania określonej sekwencji działań.
  2. Synchronizacja wątków: Czasami, gdy więcej niż jeden wątekpróbuje uzyskać dostęp do udostępnionego zasobu, musisz upewnić się, że zasób będzie używany tylko przez jeden wątek pod adresemczas.

Nie wchodźmy w szczegóły tych typów i nie próbujmy zrozumieć, na czym polegają blokady .

Blokuje w Javie

Jak wspomniałem wcześniej, synchronizacja jest zbudowana wokół wewnętrznej jednostki znanej jako zamek lub monitor . Każdy obiekt jest powiązany z blokadą. Tak więc wątek, który wymaga stałego dostępu do pól obiektu, musi uzyskać blokadę obiektu przed uzyskaniem do nich dostępu, a następnie zwolnić blokadę po zakończeniu pracy.

Począwszy od języka Java 5, pakiet java.util.concurrent.locks zawiera wiele implementacji blokad.

Tak wygląda zamek:

public class Lock {private boolean isLocked = false public synchronized void lock () throws InterruptedException {while (isLocked) {wait ()} isLocked = true} public synchronized void unlock () {isLocked = false notification ()}}

Metoda lock () blokuje wystąpienie Lock, dzięki czemu wszystkie wątki wywołujące funkcję lock () są blokowane do momentu wykonania unlock ().

Wielowątkowość bez synchronizacji

Oto prosty przykład, który drukuje wartość licznika w sekwencji i za każdym razem, gdy go uruchamiamy, daje inny wynik w zależności od dostępności procesora w wątku. Spójrz na to!

class Multithread {public void printCount () {try {for (int i = 5 i<0 i--) { System.out.println('Counter --- ' + i ) } } catch (Exception e) { System.out.println('Thread interrupted.') } } } class Thread extends Multithread { private Thread t private String threadName Multithread MT Thread( String name, Multithread mt) { threadName = name MT= mt } public void run() { MT.printCount() System.out.println('Thread ' + threadName + ' exiting.') } public void start () { System.out.println('Starting ' + threadName ) if (t == null) { t = new Thread (this, threadName) t.start () } } } public class TestThread { public static void main(String args[]) { Multithread MT = new Multithread() Thread t = new Thread( 'Thread - 1 ', MT) Thread t1 = new Thread( 'Thread - 2 ', MT) t.start() t1.start() // wait for threads to end try { t.join() t1.join() } catch ( Exception e) { System.out.println('Interrupted') } } }

Rezultatem powyższego programu jest:

Wyjście - Synchronizacja w Javie - Edureka

Wielowątkowość z synchronizacją

Jest to ten sam przykład co powyżej, ale wyświetla wartość licznika w sekwencji. Za każdym razem, gdy go uruchamiamy, daje ten sam wynik.

class Multithread {public void printCount () {try {for (int i = 5 i> 0 i--) {System.out.println ('Counter ---' + i)}} catch (Exception e) {System. out.println ('Wątek przerwany.')}}} class Thread extends Multithread {private Thread t private String threadName Multithread MT Thread (String name, Multithread mt) {threadName = name MT = mt} public void run () {synchronized ( MT) {MT.printCount ()} System.out.println ('Thread' + threadName + 'exiting.')} Public void start () {System.out.println ('Starting' + threadName) if (t == null) {t = new Thread (this, threadName) t.start ()}}} public class TestThread {public static void main (String args []) {Multithread MT = new Multithread () Thread T = new Thread ('Thread - 1 ', MT) Thread T1 = new Thread (' Thread - 2 ', MT) T.start () T1.start () // czekaj na zakończenie wątków try {T.join () T1.join ()} catch (Exception e) {System.out.println ('Interrupted')}}}

Wynik jest przedstawiony poniżej:

Zsynchronizowane słowo kluczowe

zsynchronizowane słowo kluczowe oznacza blok lub metodę jako krytyczną sekcję. Sekcja krytyczna to sytuacja, w której w danym momencie wykonywany jest tylko jeden wątek, a wątek przechowuje blokadę dla sekcji zsynchronizowanej. To zsynchronizowane słowo kluczowe pomaga w pisaniu równoległy części dowolnej aplikacji. Chroni również współdzielone zasoby w obrębie bloku.

Synchronized słowo kluczowe może być używane z:

Omówmy blok kodu.

Zsynchronizowane słowo kluczowe: blok kodu

Składnia

Ogólna składnia pisania zsynchronizowanego bloku jest następująca:

synchronized (lockObject) {// zsynchronizowane instrukcje}

Gdy wątek chce wykonać zsynchronizowane instrukcje wewnątrz bloku, musi uzyskać blokadę na monitorze lockObject. Tylko jeden wątek może jednocześnie uzyskać monitor obiektu blokady. Tak więc wszystkie inne wątki muszą czekać, aż aktualnie wykonywany wątek uzyska blokadę i zakończy wykonywanie.
W ten sposób zsynchronizowane słowo kluczowe gwarantuje, że tylko jeden wątek będzie wykonywał zsynchronizowane instrukcje blokowe na raz, a tym samym zapobiega uszkodzeniu udostępnionych danych znajdujących się w bloku przez wiele wątków.

Uwaga :

  • Jeśli wątek zostanie uśpiony (za pomocą sen() metoda), to nie zwalnia blokady. W tym czasie żaden wątek nie będzie wykonywał zsynchronizowanych instrukcji blokowych.
  • Synchronizacja Java wyrzuci NullPointerException jeśli obiekt blokady używany w „ zsynchronizowany (blokada) „Jest nieważne.

Teraz omówmy metodę.

Zsynchronizowane słowo kluczowe: Metoda

Składnia

Ogólna składnia pisania pliku metoda synchroniczna jest:

metoda synchronizowana (parametry) {// kod zsynchronizowany}

Tutaj lockObject jest po prostu odniesieniem do obiektu, którego blokada jest skojarzona z monitorem reprezentującym zsynchronizowane instrukcje.

Podobnie jak w przypadku bloku synchronicznego, wątek musi uzyskać blokadę na podłączonym obiekcie monitora metodą synchroniczną. W przypadku metody synchronicznej obiektem blokady jest:

  • Obiekt „.class” - jeśli dana metoda to statyczny .
  • „Ten” obiekt - jeśli metoda to niestatyczna . „This” jest odniesieniem do bieżącego obiektu, w którym wywoływana jest metoda synchroniczna.

Synchronizowane słowo kluczowe Java to ponownie wchodzący w naturze. Oznacza to, że jeśli metoda synchroniczna wywołuje inną metodę zsynchronizowaną, która wymaga tej samej blokady, to bieżący wątek, który utrzymuje blokadę, może wejść do tej metody bez uzyskiwania blokady.

Przejdźmy do ostatniego tematu tego artykułu i zwróćmy uwagę na główne różnice między słowem kluczowym synchronized a blokiem synchronizacji.

Różnica między zsynchronizowanym słowem kluczowym a zsynchronizowanym blokiem

  • Gdy używasz synchronizowanego słowa kluczowego z rozszerzeniem metoda , uzyskuje blokadę w obiekcie dla całej metody. Oznacza to, że żaden inny wątek nie może używać żadnej zsynchronizowanej metody, dopóki bieżący wątek, który jest wywoływany, nie zakończy wykonywania.
  • Zsynchronizowane blok uzyskuje blokadę w obiekcie tylko między nawiasami po określeniu słowa kluczowego synchronized. Oznacza to, że żaden inny wątek nie może uzyskać blokady na już zablokowanym obiekcie, dopóki blok nie wyjdzie. Ale inne wątki będą miały dostęp do reszty kodu obecnego w metodzie.

To prowadzi nas do końca tego artykułu, w którym omówiliśmy dokładnie, jak działa synchronizacja w Javie. Mam nadzieję, że wszystko, co zostało Ci udostępnione w tym samouczku, jest dla Ciebie jasne.

java znajdź największą liczbę w tablicy

Sprawdź autorstwa Edureka, zaufanej firmy zajmującej się edukacją online, z siecią ponad 250 000 zadowolonych uczniów rozsianych po całym świecie. Jesteśmy tutaj, aby pomóc Ci na każdym etapie Twojej podróży, aby zostać oprócz tych pytań do wywiadu Java, opracowaliśmy program nauczania przeznaczony dla studentów i profesjonalistów, którzy chcą zostać programistą Java.

Masz do nas pytanie? Proszę wspomnieć o tym w sekcji komentarzy w tym artykule „Synchronizacja w Javie ' artykuł, a my skontaktujemy się z Tobą tak szybko, jak to możliwe.