Sobes.tech
Middle+

Оё дар амалияи худ бо семафорҳо кор кардаед?

sobes.tech AI

Ҷавоб аз AI

Бале, ман истифода бурдаам семафорҳо, махсусан дар контексти кор бо бисёрсӯрона дар барномаҳои Android.

Семафорҳо дар Java (java.util.concurrent.Semaphore) барои маҳдуд кардани шумораи сӯронаҳое истифода мешаванд, ки метавонанд ҳамзамон ба як манбаъ дастрасӣ пайдо кунанд. Ин дар сценарияҳое, ки манбаъ дорои иқтидори маҳдуд аст, муфид аст, масалан, пулҳои пайвастшавӣ ё шумораи маҳдуди слотҳо.

Роҳҳои асосие, ки ман кор кардам:

  • acquire(): Сӯронаи ҳозираро мепӯшад, то даме ки иҷозат дода шавад.
  • acquire(int permits): Сӯронаи ҳозираро мепӯшад, то даме ки шумораи муайяни иҷозатҳо дастрас шавад.
  • release(): Иҷозатро ба семафор баргардонед, то шумораи иҷозатҳо зиёд шавад.
  • release(int permits): Шумораи муайяни иҷозатҳоро баргардонед.
  • tryAcquire(): кӯшиш мекунад иҷозатро ба даст орад, бидуни монеа эҷод кардан.
  • availablePermits(): шумораи иҷозатҳо дар ҳоли ҳозирро бармегардонад.

Масалан истифода:

import java.util.concurrent.Semaphore;

public class ResourcePool {

    private static final int MAX_AVAILABLE = 5;
    private final Semaphore permits = new Semaphore(MAX_AVAILABLE, true); // Семофор адолатманд

    public void useResource() throws InterruptedException {
        permits.acquire(); // Дархост барои иҷозат
        try {
            // Логикаи истифодаи манбаъ (масалан, кор бо пулҳои пайвастшавӣ)
            System.out.println(Thread.currentThread().getName() + " истифода мебарад манбаъ.");
            Thread.sleep(1000); // Имомияи кор бо манбаъ
        } finally {
            permits.release(); // Озод кардани иҷозат
            System.out.println(Thread.currentThread().getName() + " анҷом дод истифодаи манбаъ.");
        }
    }

    public static void main(String[] args) {
        ResourcePool pool = new ResourcePool();
        // Таҳия кардани чанд сӯрона, ки кӯшиш мекунанд истифода бурдани манбаъ
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                try {
                    pool.useResource();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

Дар ин мисол, семафор permits бо 5 иҷозатҳо оғоз мешавад, ки маънои онро дорад, ки танҳо 5 сӯрона ҳамзамон метавонанд дар дохили блоки try бошанд, ки манбаъро истифода мебаранд. Метод acquire() сӯронаҳоро мепӯшад, агар ҳама иҷозатҳо дар истифода бошанд, то дигар сӯронаҳо release() накунанд.

Семафорҳо барои идора кардани дастрасӣ ба пулҳои маҳдуди манбаъҳо муфиданд, аммо бояд ба мушкилоти эҳтимолӣ, масалан, deadlock, ки агар манбаъҳоро нодуруст идора кунем, диққат дод. Истифодаи try бо finally барои даъвати release() амалияи хуб аст, ки кафолат медиҳад, ки манбаъҳо ҳатто дар ҳолати истисно озод мешаванд.