Sobes.tech
Middle

Volatile açar sözündən başqa, iş parçaları arasında yarışma ilə mübarizə aparmaq üçün hansı üsulları bilirsiniz?

sobes.tech Süni İntellekt

AI-dan cavab

Android-da ipliklərin sinxronizasiyası və yarış şərtlərinin qarşısını almaq üçün əsas yanaşmalar mövcuddur, volatile-dən başqa.

  1. synchronized istifadə etmək: Cari iplik tamamlanana qədər digər ipliklərin kod və ya metoda girişini bloklayır.

    // Sinxronlaşdırılmış metod
    synchronized void incrementCounter() {
        counter++;
    }
    
    // Sinxronlaşdırılmış blok
    void updateData() {
        synchronized (this) { // və ya başqa monitor obyekti
            // sinxronizasiya tələb edən kod
        }
    }
    
  2. java.util.concurrent.locks paketindən siniflərdən istifadə: synchronized-dən daha çevik kilidləmə mexanizmləri təklif edir.

    import java.util.concurrent.locks.ReentrantLock;
    
    private final ReentrantLock lock = new ReentrantLock();
    
    void performLockedOperation() {
        lock.lock(); // Kilidi alma
        try {
            // Kilidlə qorunan kod
        } finally {
            lock.unlock(); // Kilidi azad etmək (vacib finally-də)
        }
    }
    
  3. java.util.concurrent.atomic paketindən siniflərdən istifadə: Atomik əməliyyatlar təmin edir, digər ipliklər tərəfindən kəsilmədən tək vahid kimi icra olunur. Sadə əməliyyatlar və referanslar üçün uyğundur.

    import java.util.concurrent.atomic.AtomicInteger;
    
    private final AtomicInteger atomicCounter = new AtomicInteger(0);
    
    void incrementAtomicCounter() {
        atomicCounter.incrementAndGet(); // Atomik artırma
    }
    
  4. İplik-təhlükəsiz kolleksiyaların istifadəsi: Kolleksiyalar java.util.concurrent paketindən (məsələn, ConcurrentHashMap, CopyOnWriteArrayList) çox iplikli mühitdə təhlükəsiz istifadə üçün hazırlanmışdır.

    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); // Təhlükəsiz yazma əməliyyatı
    }
    
  5. ThreadLocal istifadə etmək: Hər iplik üçün ayrı nüsxə saxlayan dəyişən yaratmağa imkan verir. Beləliklə, hər iplik öz məlumat nüsxəsi ilə işləyir və yarış şərtləri qarşısı alınır.

    private final ThreadLocal<Integer> threadLocalValue = new ThreadLocal<Integer>() {
        @Override
        protected Integer initialValue() {
            return 0; // Hər iplik üçün başlanğıc dəyər
        }
    };
    
    void processData() {
        int value = threadLocalValue.get();
        value++;
        threadLocalValue.set(value); // Cari iplik üçün dəyəri təyin et
    }
    

Yanaşma seçimi vəzifənin xüsusiyyətlərinə, kilidləmə ehtiyacına, məlumat tipinə və tələb olunan performansa bağlıdır.