Java-da semafor


JavaBaxılıb 125

Sistem dizaynı ilə bağlı müsahibə sualları o qədər açıq ola bilər ki, düzgün hazırlaşmağı bilmək çox çətindir. İndi satın aldıqdan sonra Amazon, Microsoft və Adobe-nin dizayn dövrlərini sındıra bilirəm Bu kitabı. Gündəlik bir yenidən nəzərdən keçirin dizayn sualı və söz verirəm ki, dizayn dövrünü sındıra bilərsiniz.

Bu təlimatda Java-da Semaforu, onun inşaatçılarmetodikabağlamaq ətraflı nümunələrdən istifadə edərək tətbiqetmə.

Java-da semaforPin

Java Semafor

Semafor tətbiq edən texnikalardan biridir mövzu sinxronizasiyası. Semaforun əsas istifadəsi sayğac dəyişənindən istifadə edərək paylaşılan mənbəyə girişə nəzarət etməkdir. Java-da bir semafor istifadə edərək, paylaşılan mənbəyə daxil ola bilən mövzu sayını məhdudlaşdıra bilərik. Bu şəkildə qarşısını alır irqi şərtləri. Bütün mövzular arasında paylaşılan mənfi olmayan bir dəyər olan bir sayğacı təmsil edir. Bir sayğac, sayğac dəyişəni 0-dan çox olduqda, girişi inkar edən bir qaynaq mənbəyə daxil ola bilər. Başqa sözlə, anlama zamanı verdiyimiz icazə sayına əsasən, eyni əldə edə bilən iplik sayını izləyir.

Semaforun işlənməsi

Yuxarıdakı hissədə gördüyümüz kimi, bir semafor, bütün mövzuları arasında paylaşa biləcəyimiz bir əks dəyişəni təmsil edir. 0 və ya 0-dan böyük hər hansı bir mənanı ifadə edən mənfi olmayan bir dəyərə sahibdir.

  • Əvvəlcə semaforu lazımi sayda icazə ilə başlatırıq.
  • Sonra mövzu vəziyyəti yoxlayır counter>0. Əgər doğru, paylaşılan mənbəyə icazə alır və sayğac dəyişənini azaldır. Əgər yanlış, ipliyi bloklayır və növbəti icazəni gözləyir.
  • Mövzu paylaşılan mənbənin icrasını tamamladıqdan sonra resurs icazəsini buraxır və sayğacı artırır.
  • If counter=0, sonra paylaşılan mənbəyə icazə verilmir.

Aşağıdakı axın şeması bir semaforun işini ətraflı şəkildə anlamağa kömək edəcəkdir.

Java-da semaforPin

Java'da Semafor növləri

Java'da müxtəlif semafor növləri var:

  • Semaforun sayılması: Birdən çox prosesin kritik bir hissəni icra etmək istədiyi problemi həll edir.
  • Məhdud semafor: Bu, neçə semafor saxlaya biləcəyini ifadə edən yuxarı sərhəddir.
  • Müddətli semafor: Bu, bir mövzuya müəyyən bir müddət ərzində icra edilməsinə imkan verir.
  • İkili semafor: Semaforun sayılmasına bənzəyir, ancaq yalnız ikili dəyərlərdən ibarətdir, yəni 0 və ya 1.

Java Semafor qurucuları

Semafora aşağıda göstərildiyi kimi 2 növ konstruktor daxildir:

konstruktortəsvir
Semafor (int icazələri)İcazələrin sayını başlatan bir semafor yaradır
Semafor (int icazələri, boolean yarmarkası)İcazələrin sayını ədalət parametri ilə birlikdə başlatan bir semafor yaradır

Semafor metodları

Üsultəsvir
ləğv etmək ()Hamısı hazır olana qədər bu semaforun bloklanmasından icazə alır
ləğv etmək (int icazə)Bu semaforun bloklanmasından hamısı mövcud olana qədər verilən icazə sayını əldə edir
void acquireUninterruptibly ()Bu semaforun bloklanmasından mövcud olana qədər icazə alır
void acquireUn kəsilməz (int icazələri)Bu semaforun bloklanmasından hamısı mövcud olana qədər verilən icazə sayını əldə edir
int availablePermits ()Hazırda mövcud icazə sayını qaytarır
int drainPermits ()Dərhal mövcud olan bütün icazələri alır və qaytarır
int getQueueLength ()İcazə almaq üçün gözləyən iplik sayını qaytarır
boolean hasQueuedThreads ()İcazə almağı gözləyən iplər varsa, doğru qayıdır
boolean isFair ()Semafor ədalət xassəsini təyin etmişsə, doğru qayıdır
boş buraxma ()Semaforu buraxır
etibarsız buraxılma (int icazələri)Verilən icazə sayını semafora buraxır
boolean tryAcquire ()Semafordan icazə alır, yalnız bir dəfəyə biri varsa
boolean tryAcquire (int icazələri)Verilən icazə sayını yalnız hamısı mövcud olduqda əldə edir
boolean tryAcquire (uzun müddət, TimeUnit vahidi)Verilən icazə sayını yalnız müəyyən edilmiş müddətdə əldə edildiyi təqdirdə alır
boolean tryAcquire (int icazələri, uzun müddət, TimeUnit vahidi)Verilən icazə sayını yalnız müəyyən edilmiş müddətdə hamısı mövcud olduqda əldə edir

Java Semafor nümunəsi - Kilid kimi

Aşağıda bir Semaforu paylaşılan mənbəyə girişi məhdudlaşdırmaq üçün kilid kimi necə istifadə edə biləcəyimizə dair bir nümunə verilmişdir. Mövzu siniflərindən biri sayğac dəyərini artırır və digər mövzu sinfi sayğac dəyərini azaldır. Paylaşılan mənbəyə çatmazdan əvvəl mövzu istifadə edərək icazəni əldə edir acquire() metod. İcra tamamlandıqdan sonra istifadə icazəsini buraxır release() metod. Bu şəkildə, digər mövzuların yenidən icazə istəməsinə icazə verir. Counter sinfi sayılan paylaşılan dəyişəni ehtiva edir. Maraqlana bilərsiz Java-da paralel xidmətlər

import java.util.concurrent.Semaphore;

class Counter {
  static int count = 0;
}

class SemaphoreDemoLock extends Thread {
  
  Semaphore s;
  String name;
  
  SemaphoreDemoLock(Semaphore s, String name){
    this.s = s;
    this.name = name;
  }
  
  public void run() {
    if(this.getName().equals("Thread 1")) {
      System.out.println(name + " started execution");
      
      try {
        System.out.println(name + " waiting to acquire permit");
        s.acquire();
        System.out.println(name + " acquired permit");
        
        for(int i=0;i<3;i++) {
          Counter.count++;
          System.out.println(name + ":" + Counter.count);
          Thread.sleep(1000);
        }
      }
      catch(InterruptedException e) {
        e.printStackTrace();
      }
      System.out.println(name + " releasing permit");
      s.release();
    }
    else {
      System.out.println(name + " started execution");
      
      try {
        System.out.println(name + " waiting for permit");
        s.acquire();
        System.out.println(name + " acquired permit");
        
        for(int i=0;i<3;i++) {
          Counter.count--;
          System.out.println(name + ":" + Counter.count);
          Thread.sleep(1000);
        }
      }
      catch(InterruptedException e) {
        e.printStackTrace();
      }
      
      System.out.println(name + " releasing permit");
      s.release();
    }
  }

}


public class SemaphoreDemo {
  public static void main(String[] args) throws InterruptedException {
    Semaphore s = new Semaphore(1);
    
    SemaphoreDemoLock sd1 = new SemaphoreDemoLock(s, "Thread 1");
    SemaphoreDemoLock sd2 = new SemaphoreDemoLock(s, "Thread 2");
    
    sd1.start();
    sd2.start();
    
    
    sd1.join();
    sd2.join();
    
    System.out.println("Counter value: " + Counter.count);
  }
}
Thread 2 started execution
Thread 2 waiting for permit
Thread 1 started execution
Thread 1 waiting for permit
Thread 2 acquired permit
Thread 2:-1
Thread 2:-2
Thread 2:-3
Thread 2 releasing permit
Thread 1 acquired permit
Thread 1:-4
Thread 1:-5
Thread 1:-6
Thread 1 releasing permit
Counter value: -6

Semafor Nümunəsi

Bu nümunədə, müəyyən sayda icazə ilə bir Semaforun necə yaradılacağını görə bilərik. 3 icazə ilə bir Semafor qurucusu yaradırıq. Mövcud icazə sayını istifadə edərək yoxlaya bilərik availablePermits()metod. Bir iplik istifadə edərək icazəni əldə edə bilər acquire() metodunu istifadə edərək buraxın release() metod. 2 fərqli yaratmaqla kilid sinxronizasiyasını aydın şəkildə başa düşə bilərik mövzuları.

import java.util.concurrent.Semaphore;

public class SemaphoreExample {
  
  static Semaphore s = new Semaphore(3);
  
  static class SampleThread extends Thread {
    String name = "";
    SampleThread(String name){
      this.name = name;
    }
    
    public void run() {
      try {
        System.out.println("Available number of permits for " + name + " is: " + s.availablePermits());
        System.out.println(name + " waiting to acquire lock");
        
        s.acquire();
        System.out.println(name + " acquired permit");
        
        try {
          for(int i=0;i<3;i++) {
            System.out.println(name + " executing " + ":" + " Available number of permits: " + s.availablePermits());
            Thread.sleep(1000);
          }
        }
        finally {
          System.out.println(name + " releasing permit");
          s.release();
          System.out.println("Available number of permits for " + name + " is: " + s.availablePermits());
        }
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      
    }
  }

  public static void main(String[] args) throws InterruptedException {
    
    System.out.println("Total number of available permits: " + s.availablePermits());
    SampleThread st1 = new SampleThread("Thread 1");
    
    st1.start();
    
    SampleThread st2 = new SampleThread("Thread 2");
    
    st2.start();
    
  }

}
Total number of available permits: 3
Available number of permits for Thread 1 is: 3
Available number of permits for Thread 2 is: 3
Thread 1 waiting to acquire lock
Thread 2 waiting to acquire lock
Thread 1 acquired permit
Thread 1 executing : Available number of permits: 2
Thread 2 acquired permit
Thread 2 executing : Available number of permits: 1
Thread 1 executing : Available number of permits: 1
Thread 2 executing : Available number of permits: 1
Thread 2 executing : Available number of permits: 1
Thread 1 executing : Available number of permits: 1
Thread 1 releasing permit
Thread 2 releasing permit
Available number of permits for Thread 1 is: 2
Available number of permits for Thread 2 is: 3

Bir məqalə oxumaqla maraqlana bilərsiniz Java-da çox işləmə

arayış İstinad2

Crack Sistemi Dizayn Müsahibələri
Translate »
1