Sobes.tech
Middle+

Ինչպես է աշխատում 'synchronized' սինխրոնիզացիայի մեխանիզմը Java լեզվում՝ թաքնված կերպով?

sobes.tech AI

Պատասխան AI-ից

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

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

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

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

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

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

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

Այս հրահանգները Java բայթ կոդի մաս են և մշակվում են 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() Ծանուցում է բոլոր սպասող թելերին: