Sobes.tech
Middle

რა მეთოდებს იცნობთ თხელი რგოლების რბოლასთან ბრძოლისთვის, გარდა volatile საკვანძო სიტყვას გამოყენებისა?

sobes.tech AI

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

Androidда жиптердин синхрондошуусу жана жарыш шарттарын алдын алуу үчүн volatile менен кошумча негизги ыкмалар бар.

  1. synchronized колдонуу: Бул башка жиптер үчүн кодго же методго кирүүнү токтотот, азыркы жип аяктагандан кийин гана.

    // синхрондоштурулган метод
    synchronized void incrementCounter() {
        counter++;
    }
    
    // синхрондоштурулган блок
    void updateData() {
        synchronized (this) { // же башка монитор объект
            // синхрондоштурууну талап кылган код
        }
    }
    
  2. java.util.concurrent.locks пакети классдарын колдонуу: Бул synchronizedке караганда көбүрөөк ийкемдүү блоктоо механизмдерин сунуштайт.

    import java.util.concurrent.locks.ReentrantLock;
    
    private final ReentrantLock lock = new ReentrantLock();
    
    void performLockedOperation() {
        lock.lock(); // блоктоону алуу
        try {
            // блоктоого корголгон код
        } finally {
            lock.unlock(); // блоктоону бошотуу (жана маанилүү)
        }
    }
    
  3. java.util.concurrent.atomic пакети классдарын колдонуу: Бул атомдук операцияларды сунуштайт, алар бүтүндөй бирдикте, башка жиптердин кийлигишүүсүз аткарылат. Бул жөнөкөй операциялар үчүн, примиативдүү түрлөр жана шилтемелер менен иштөөдө ылайыктуу.

    import java.util.concurrent.atomic.AtomicInteger;
    
    private final AtomicInteger atomicCounter = new AtomicInteger(0);
    
    void incrementAtomicCounter() {
        atomicCounter.incrementAndGet(); // атомдук көбөйтүү
    }
    
  4. Жипке коопсуз коллекциялар колдонуу: Коллекциялар java.util.concurrent пакети колдонуучу үчүн көпжиптүү чөйрөдө корголгон колдонууга ылайыкталган, жана иштеп чыгуучу тарабынан ачык синхрондоштууну талап кылбайт.

    import java.util.concurrent.ConcurrentHashMap;
    import java.util.Map;
    
    private final Map<String, Integer> concurrentMap = new ConcurrentHashMap<>();
    
    void updateMap(String key, Integer value) {
        concurrentMap.put(key, value); // коопсуз жазуу операциясы
    }
    
  5. ThreadLocal колдонуу: Бул өзгөрмө ар бир жип үчүн өзүнчө көчүрмөсү болот дегенди билдирет. Ошентип, ар бир жип өзүнүн жеке маалыматтары менен иштейт, бул жарыш шарттарын жокко чыгарат.

    private final ThreadLocal<Integer> threadLocalValue = new ThreadLocal<Integer>() {
        @Override
        protected Integer initialValue() {
            return 0; // ар бир жип үчүн баштапкы мааниси
        }
    };
    
    void processData() {
        int value = threadLocalValue.get();
        value++;
        threadLocalValue.set(value); // учурдагы жип үчүн маанини коюу
    }
    

Методду тандоо тапшырманын өзгөчөлүктөрүнө, қажетті блокировка, маалымат түрүнө жана талап кылынган иштөө ылдамдыгына көз каранды.