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 пакети коллекциялары (мисалы, 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); // учурдагы жип үчүн маанини коюу
    }
    

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