Java-da uçucu söz


Java Sap volatileBaxılıb 62

Java-da uçucu söz

A çox oxlu mühit, bir çox mövzuların eyni paylaşılan dəyişəni yeniləməyə çalışdığı bir neçə vəziyyət var. Bu, Java-da paralellik problemlərinə səbəb ola biləcəyi deməkdir. Bunun öhdəsindən gəlmək və təhlükəsizliyi təmin etmək üçün paylaşılan dəyişənləri yeniləmək üçün Java-dakı uçucu sözdən istifadə edə bilərik.

İbtidai məlumat növləri və ya obyektlər üçün uçucu açar sözdən istifadə edə bilərik. Ayrıca, onu yalnız dəyişənlər üçün istifadə edə bilərik, metodlar və siniflər üçün deyil. Uçucu dəyişənlər həmişə əsas yaddaşdan məlumatları birbaşa oxuyur və yazırlar. Dəyişənlərin düzgün sıralanmasını və görünməsini təmin edir.

Dəyişkən olmadan paralellik məsələsi

Təsəvvür edin ki, 2 mövzu var T1T2 eyni paylaşılan dəyişəni istifadə edən idi və kompüterdə daha yaxşı performans üçün birdən çox CPU var. Bunu elan etmədikdə dəyişən uçucu olduğu üçün hər iki mövzu var dəyişənini öz CPU önbelleğine oxuya və yaza bilər və əsas yaddaşı yeniləmir. Bu şəkildə, hər bir mövzu uyğun önbellekdə öz dəyişən nüsxəsinə, ana yaddaşda fərqli bir qiymətə sahibdir. Bu, hər iki mövzu eyni anda eyni dəyişəni oxumağa və yeniləməyə çalışdıqda səhv dəyişən yeniləmələrə səbəb ola bilər. Java-da başqa bir paralellik məsələsidir.

Aşağıdakı diaqram yuxarıdakı məsələni açıq şəkildə izah edir. Bu məsələyə dəyişkən görünürlük problemi.

Java paralelliyiPin

Görmə probleminin həlli

İndi uçucu dəyişənin görmə problemini necə həll etdiyini görək. Uçucu bir dəyişən üçün hər dəfə yazdığımız və ya yenilədiyimiz zaman dərhal ana yaddaşa yazır. Ayrıca, bütün mövzuların bu dəyişən dəyərləri yalnız əsas yaddaşdan oxumasına icazə verilir. Bu şəkildə bir mövzu dəyəri yeniləyir və digər mövzu eyni dəyişəni oxuyur, hər iki mövzu eyni yenilənmiş dəyişən dəyərini oxuyacaq. Bu, iş parçacığının dərhal əsas yaddaşdakı dəyəri yeniləməsi ilə əlaqələndirilir ki, digər iplər əsas yaddaşdakı dəyəri oxuya bilsin.

Java-da uçucu sözPin

Aşağıda uçucu dəyişən elan etmək sintaksisidir.

public volatile int var = 5;

Tutaq ki, hər iki mövzu paylaşılan dəyişəni yeniləmək istəyir, o zaman uçucu söz kifayət deyil. Bunun üçün ayrıca bir təlimdə müzakirə edəcəyimiz sinxronizasiya edilmiş açar sözdən istifadə etməliyik.

Uçucu sözün istifadəsi

  • Dəyişəni yeniləmək üçün 1 mövzu və dəyişəni oxumaq üçün birdən çox mövzu olduqda uçucu açar sözlərdən istifadə edin. Bu şəkildə, digər mövzuların hamısı eyni dəyəri oxuyacaq, əks halda hər biri fərqli bir dəyər oxuya bilər.
  • Java-da sinxronizasiya tətbiqetməsinin başqa bir üsuludur.
  • Kodun yenidən sıralanmasının qarşısını alır və əsas yaddaş əvəzinə önbellek yaddaşına dəyər yazılmasının qarşısını alır.
  • Uçucu açar sözdən dərslər və metodlar üçün deyil, yalnız dəyişənlər üçün istifadə edə bilərik.
  • Dəyişən dəyişənlər yerinə yetirir atom hərəkət o deməkdir ki, ip hər hansı bir əməliyyata başladıqda, digər iplər yalnız əvvəlki ip onu tamamladıqda eyni dəyişən üzərində hərəkət edə bilər.
  • Uçucu dəyişən yalnız paylaşılan dəyişənlər üçün tələb olunur. Birdən çox mövzu eyni dəyişənə daxil olmadıqda uçucu elan etmək tələb olunmur.

Java-da uçucu söz nümunəsi

Aşağıda bir sayğacın dəyəri yenilədiyi və digər mövzu dəyərini oxuduğu bir sayğac dəyişkənliyi üçün java dəyişkən bir açar sözdən istifadə nümunəsidir. Yazma ipliyi işini başa vurduqdan sonra uçucu sözdən istifadə etdiyimizə görə oxunuşu icra edir və yenidən icraya davam edir. Bu, Java-da paralellik problemini həll edir.

public class VolatileDemo {
  private static volatile int val = 0;

  public static void main(String[] args) {
    new readData().start();
    new writeData().start();

  }
  
  static class readData extends Thread {
    public void run() {
      int num = val;
      while(num < 3) {
        if(num != val) {
          System.out.println("New Value: " + val);
          num = val;
        }
      }
    }
  }
  
  static class writeData extends Thread {
    public void run() {
      int num = val;
      while(val < 3) {
        System.out.println("Increment value: " + (num+1));
        val = ++num;
        try {
          Thread.sleep(200);
        }
        catch(Exception e) {
          e.printStackTrace();
        }
      }
    }
  }

}


Increment value: 1
New Value: 1
Increment value: 2
New Value: 2
Increment value: 3
New Value: 3

Tutaq ki, java uçucu açar sözdən istifadə etmirik, onda nəticə aşağıdakı kimi olacaq və writeData iş parçası sonsuz şəkildə icra olunur.

Increment value: 1
New Value: 1
Increment value: 2
Increment value: 3

Uçucu və sinxronizasiya edilmiş söz arasındakı fərq

Aşağıda Java-dakı uçucu söz və sinxronizasiya edilmiş açar söz arasındakı fərqlər verilmişdir.

uçucu sözsinxronizasiya edilmiş söz
Yalnız dəyişənlər üçün istifadə edilə bilərDəyişənlər, metodlar və kod blokları üçün istifadə edilə bilər
Gözləmə ipini bloklaya bilmərikGözləmə ipini bloklaya bilərik
Mövzu işini yaxşılaşdırırMövzu işini pisləşdirir
Kompilyator optimallaşdırmasına imkan vermirKompilyator optimallaşdırmasına imkan verir
Hər dəfə yalnız 1 dəyişənin dəyərini sinxronlaşdırırBütün dəyişənlərin dəyərini bir anda sinxronlaşdırır

arayış

Şərh yaz

Translate »
1