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(); // озод кардани баст (мухим дар finally)
        }
    }
    
  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 (масалан, ConcurrentHashMap, CopyOnWriteArrayList) барои истифодаи бехатари дар муҳити бисёрсӯрохиҳо бидуни ҳамоҳангсозии ошкоро тарҳрезӣ шудаанд.

    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); // таъин кардани арзиш барои сӯрохи ҳозир
    }
    

Интихоби усул вобаста ба хусусиятҳои вазифа, ниёз ба бастан, навъи маълумот ва талаботи иҷроиш мебошад.