Sobes.tech
Middle+

როგორ მუშაობს 'synchronized' სინქრონიზაციის მექანიზმი Java-ში?

sobes.tech AI

პასუხი AI-სგან

Java-да synchronized մեխանիզմը հիմնված է մոնիտորների (monitor objects) կոնցեպտի վրա: Յուրաքանչյուր օբյեկտ Java-ում կապված է մոնիտորի հետ:

Երբ մի թել մտնում է սինխրոնիզացված բլոկ կամ մեթոդ, նա փորձում է ձեռք բերել համապատասխան օբյեկտի մոնիտորը: Եթե մոնիտորը ազատ է, այն գրավում է այն և շարունակում է գործարկել: Եթե մոնիտորը զբաղված է այլ թելով, ընթացիկ թելը բլոկվում է և անցնում է սպասման վիճակի, մինչև մոնիտորը ազատվի:

Երբ թելը լքում է սինխրոնիզացված բլոկը կամ մեթոդը (հաջողությամբ կամ արտահայտության միջոցով), այն ազատում է մոնիտորը:

Մոնիտորի ներսում իրականացված են՝

  1. Միմյանց բացառություն (Mutual Exclusion): Միաժամանակ միայն մեկ թել կարող է տիրապետել օբյեկտի մոնիտորին: Սա ապահովում է, որ միայն մեկ թել կարող է կատարել սինխրոնիզացված կոդը տվյալ օբյեկտի համար:
  2. Սպասում և ծանուցում (Waiting and Notification): Մոնիտորը ներառում է wait(), notify() և notifyAll() մեթոդների հավաքածու: Այս մեթոդները թույլ են տալիս թելերին, որոնք տիրապետում են մոնիտորին, ժամանակավորապես ազատել այն և անցնել սպասման վիճակի, իսկ հետո մյուս թելերը կարող են ծանուցվել, որ կարող են շարունակել աշխատանքը:

Ներքին իրականացման մեջ ներառված են՝

  • monitorenter հրահանգը: Կատարվում է սինխրոնիզացված բլոկ կամ մեթոդի մուտքի ժամանակ: Փորձում է գրավել օբյեկտի մոնիտորը:
  • monitorexit հրահանգը: Կատարվում է սինխրոնիզացված բլոկ կամ մեթոդից դուրս գալու ժամանակ: Մոնիտորը ազատում է օբյեկտը:

Այս հրահանգները մաս են Java բայթ կոդի և մշակվում են JVM-ի կողմից: JVM-ը օգտագործում է օպերացիոն համակարգի բնիկ մեխանիզմներ (օրինակ, mutexes, semaphores) մոնիտորների կառավարման և թելերի բլոկավորման/անբլոկավորման համար:

Մոնիտորի գրավումը կարող է իրականացվել օբյեկտի մակարդակով (օրինակ, instance methods և blocks) կամ դասի մակարդակով (օրինակ, static methods և blocks), օգտագործելով Class օբյեկտը որպես բլոկ:

Օրինակ օգտագործման համար՝

public class Counter {
    private int count = 0;

    public synchronized void increment() { // Սինխրոնիզատոր մեթոդ
        count++;
    }

    public void decrement() {
        synchronized (this) { // Սինխրոնիզացված բլոկ
            count--;
        }
    }

    public static synchronized void staticMethod() { // Սինխրոնիզացված static մեթոդ
        // ...
    }
}

Object դասի մեթոդների աղյուսակը, որոնք կապված են մոնիտորների հետ՝

Մեթոդ Նկարագրություն
wait() Թել, որը տիրապետում է մոնիտորին, ժամանակավորապես ազատում է այն և անցնում է սպասման վիճակի:
notify() Ծանուցում է սպասող մեկ թելին, որ նա կարող է փորձել գրավել մոնիտորը և շարունակել աշխատանքը:
notifyAll() Ծանուցում է բոլոր սպասող թելերին: