Sobes.tech
Middle+

Təcrübənizdə semaforlarla işlədinizmi?

sobes.tech Süni İntellekt

AI-dan cavab

Bəli, semaforlardan istifadə etməli oldum, xüsusən Android tətbiqlərində çoxmərhələli işləmə kontekstində.

Java'da (java.util.concurrent.Semaphore) semaforlar müəyyən bir resursa eyni zamanda giriş edə biləcək iş parçacığı sayını məhdudlaşdırmaq üçün istifadə olunur. Bu, resursun "həcmi" məhdud olan ssenarilərdə, məsələn, əlaqə hovuzu və ya məhdud sayda mövcud slotlar üçün faydalıdır.

Əsas işlədiyim metodlar bunlardır:

  • acquire(): Mövcud icazə olana qədər cari iş parçacığını bloklayır.
  • acquire(int permits): Göstərilən sayda icazə mövcud olana qədər iş parçacığını bloklayır.
  • release(): Semafora icazə verir və mövcud icazələrin sayını artırır.
  • release(int permits): Göstərilən sayda icazə verir.
  • tryAcquire(): İş parçacığını bloklamadan icazə almağa çalışır.
  • availablePermits(): Mövcud icazələrin sayını qaytarır.

İstifadə nümunəsi:

import java.util.concurrent.Semaphore;

public class ResourcePool {

    private static final int MAX_AVAILABLE = 5;
    private final Semaphore permits = new Semaphore(MAX_AVAILABLE, true); // Ədalətli semafor

    public void useResource() throws InterruptedException {
        permits.acquire(); // İcazə tələb edir
        try {
            // Resursun istifadəsi ilə bağlı loqika (məsələn, əlaqə hovuzunda işləmək)
            System.out.println(Thread.currentThread().getName() + " resursdan istifadə edir.");
            Thread.sleep(1000); // Resursla işləmənin simulasyonu
        } finally {
            permits.release(); // İcazəni azad edir
            System.out.println(Thread.currentThread().getName() + " resursdan istifadəni bitirdi.");
        }
    }

    public static void main(String[] args) {
        ResourcePool pool = new ResourcePool();
        // Bir neçə iş parçacığı yaradırıq, onlar resursdan istifadə etməyə çalışacaq
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                try {
                    pool.useResource();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

Bu nümunədə, permits semaforu 5 icazə ilə başlanır, bu da eyni zamanda yalnız 5 iş parçacığının resursu istifadə edə biləcəyini göstərir. acquire() metodu bütün icazələr istifadə olunduqda iş parçacığını bloklayır və digər iş parçacqları release() çağırana qədər gözləyir.

Semaforlar məhdud resurs hovuzlarına girişin idarə olunması üçün faydalıdır, lakin icazələrin alınması və azad olunması düzgün idarə olunmazsa, deadlock kimi problemlər yarana bilər. tryfinally ilə release() çağırışını istifadə etmək, istisnalar olsa belə, resursların düzgün azad olunmasını təmin etmək üçün yaxşı təcrübədir.