როგორ მუშაობს 'synchronized' სინქრონიზაციის მექანიზმი Java-ში?
sobes.tech AI
პასუხი AI-სგან
Java-да synchronized մեխանիզմը հիմնված է մոնիտորների (monitor objects) կոնցեպտի վրա: Յուրաքանչյուր օբյեկտ Java-ում կապված է մոնիտորի հետ:
Երբ մի թել մտնում է սինխրոնիզացված բլոկ կամ մեթոդ, նա փորձում է ձեռք բերել համապատասխան օբյեկտի մոնիտորը: Եթե մոնիտորը ազատ է, այն գրավում է այն և շարունակում է գործարկել: Եթե մոնիտորը զբաղված է այլ թելով, ընթացիկ թելը բլոկվում է և անցնում է սպասման վիճակի, մինչև մոնիտորը ազատվի:
Երբ թելը լքում է սինխրոնիզացված բլոկը կամ մեթոդը (հաջողությամբ կամ արտահայտության միջոցով), այն ազատում է մոնիտորը:
Մոնիտորի ներսում իրականացված են՝
- Միմյանց բացառություն (Mutual Exclusion): Միաժամանակ միայն մեկ թել կարող է տիրապետել օբյեկտի մոնիտորին: Սա ապահովում է, որ միայն մեկ թել կարող է կատարել սինխրոնիզացված կոդը տվյալ օբյեկտի համար:
- Սպասում և ծանուցում (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() |
Ծանուցում է բոլոր սպասող թելերին: |