Sobes.tech
Middle

Ի՞նչ հիմնական սինխրոնիզացիայի մեթոդներ կան Java-ում։

sobes.tech AI

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

Java- ում հիմնական հիմնական մեթոդները սինխրոնիզացիայի:

  1. 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--;
            }
        }
    }
    
  2. volatile բանալի բառը:

    • Գаранտավորում է փոփոխականի տեսանելիությունը հոսանքների միջև:
    • Չգаранտավորում է բարդ օպերացիաների (օրինակ, i++) ագրեգատությունը, միայն ընթերցում և գրառում:
    • Կիրառվում է դասի դաշտերի վրա:
    class SharedData {
        volatile boolean flag = false;
    
        public void setFlag(boolean value) {
            flag = value; // Փոփոխության տեսանելիություն մյուս հոսանքների համար
        }
    
        public boolean getFlag() {
            return flag;
        }
    }
    
  3. Արագացված արգելափակոցներ (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() + " ազատեց բլոկը");
            }
        }
    }
    
  4. 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- ում անվտանգ բազմահոսքային կոդ ստեղծելու համար: Ընտրությունը կախված է առաջադրանքի առանձնահատկություններից և անհրաժեշտ վերահսկողության մակարդակից։