Sobes.tech
Middle+

Практикаңызда семафорлор менен иштедиңизби?

sobes.tech AI

AIден жооп

Ооба, мен семафорлорду колдонуп келгенмин, айрыкча Android тиркемелериндеги көптөгөн жиптер менен иштөө контекстинде.

Javaда (java.util.concurrent.Semaphore) семафорлор белгилүү бир ресурска бир мезгилде кайсы гана жиптер кире аларын чектөө үчүн колдонулат. Бул ресурстун чектелген "кабылдоо" мүмкүнчүлүктөрү бар учурларда пайдалуу, мисалы, байланыштар пулу же жеткиликтүү слоттордун чектелген саны.

Мен иштеген негизги ыкмалар:

  • acquire(): Учурдагы жипти токтотуп, уруксат берилгенге чейин күтөт.
  • acquire(int permits): Учурдагы жипти токтотуп, белгиленген уруксаттар саны жеткенге чейин күтөт.
  • release(): Семaфорго уруксатты кайтарат, жеткиликтүү уруксаттардын санын көбөйтөт.
  • 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 гана жип болушу мүмкүн дегенди билдирет. acquire() ыкмасы бардык уруксаттар алынган болсо, башка жиптер күтүүгө мажбур болот, башкача айтканда, release() чакырылгандан кийин гана.

Семафорлор чектелген ресурстардын пулдарын башкарууда пайдалуу, бирок потенциалдуу көйгөйлөргө, мисалы, deadlock-торго дуушар болбоо үчүн, уруксаттарды алуу жана бошотуу туура башкарылышы керек. try жана finally менен release() чакыруусу жакшы практика болуп саналат, ал ресурстардын бошотулушун камсыз кылат, даже исключения учурларында да.