Middle
Ի՞նչ հիմնական սինխրոնիզացիայի մեթոդներ կան Java-ում։
sobes.tech AI
Պատասխան AI-ից
Java- ում հիմնական հիմնական մեթոդները սինխրոնիզացիայի:
-
synchronizedբանալի բառը:- Օգտագործվում է մեթոդների կամ կոդի բլոկների սինխրոնիզացման համար:
synchronizedնշված մեթոդը արգելափակում է մուտքը օբյեկտի օրինակին մյուս սինխրոնիզացված մեթոդների համար:synchronized (this): սինխրոնիզացիա ներկայիս օբյեկտի օրինակով:synchronized (ClassName.class): սինխրոնիզացիա դասի վրա, արգելափակում է մուտքը բոլոր հոսանքների համար, որոնք աշխատում են այդ դասով:synchronized (object): սինխրոնիզացիա կոնկրետ մոնիտոր օբյեկտով:
class Counter { private int count = 0; // Սինխրոնիզացված մեթոդ public synchronized void increment() { count++; } public void decrement() { // Սինխրոնիզացված բլոկ synchronized (this) { count--; } } } -
volatileբանալի բառը:- Գаранտավորում է փոփոխականի տեսանելիությունը հոսանքների միջև:
- Չգаранտավորում է բարդ օպերացիաների (օրինակ,
i++) ագրեգատությունը, միայն ընթերցում և գրառում: - Կիրառվում է դասի դաշտերի վրա:
class SharedData { volatile boolean flag = false; public void setFlag(boolean value) { flag = value; // Փոփոխության տեսանելիություն մյուս հոսանքների համար } public boolean getFlag() { return flag; } } -
Արագացված արգելափակոցներ (Explicit Locks):
- Ներկայացնում են ավելի ճկուն վերահսկողություն
synchronized-ի համեմատ: Lockինտերֆեյսը և նրա իրագործումները, օրինակReentrantLock:- Позволяют выбирать между честным и нечестным режимом блокировки, получать состояние блокировки, прерывать поток во время ожидания блокировки:
- Պահանջում է բացահայտ
lock()ևunlock()կանչեր, կարևոր է օգտագործելfinallyբլոկըunlock()-ի համար:
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class Resource { private final Lock lock = new ReentrantLock(); public void performAction() { lock.lock(); // Բլոկի գրավում try { // Կրիտիկական հատված System.out.println(Thread.currentThread().getName() + " գրավեց բլոկը"); Thread.sleep(100); // Աշխատանքի իմիտացիա } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); // Բլոկի ազատում System.out.println(Thread.currentThread().getName() + " ազատեց բլոկը"); } } } - Ներկայացնում են ավելի ճկուն վերահսկողություն
-
wait(),notify(),notifyAll():Objectդասի մեթոդներ, որոնք օգտագործվում են հոսանքների փոխազդեցության համար, որոնք սպասում են մոնիտորի ազատմանը:wait(): ազատում է մոնիտորին և տեղափոխում հոսանքը սպասման վիճակի մինչևnotify()կամnotifyAll()-ի կանչը:notify(): մի հոսանք է արթնացնում, որը սպասում է այդ մոնիտորին:notifyAll(): արթնացնում է բոլոր հոսանքներին, որոնք սպասում են այդ մոնիտորին:- Դրանք պետք է կանչվեն նույն օբյեկտի սինխրոնիզացված բլոկում կամ մեթոդում:
class ProducerConsumer { private final Object monitor = new Object(); private boolean isProduced = false; public void produce() throws InterruptedException { synchronized (monitor) { while (isProduced) { monitor.wait(); // Սպասում, մինչև սպառողը կերակրի } // Պատրաստում System.out.println("Պատրաստեց"); isProduced = true; monitor.notifyAll(); // Հաղորդում սպառողներին } } public void consume() throws InterruptedException { synchronized (monitor) { while (!isProduced) { monitor.wait(); // Սպասում, մինչև արտադրողը կստեղծի } // Սպառում System.out.println("Սպառեց"); isProduced = false; monitor.notifyAll(); // Հաղորդում արտադրողներին } } }
Այս մեխանիզմները հիմքն են ապահովելու համար Java- ում անվտանգ բազմահոսքային կոդ ստեղծելու համար: Ընտրությունը կախված է առաջադրանքի առանձնահատկություններից և անհրաժեշտ վերահսկողության մակարդակից։