Java-da ThreadLocal


Java Çox oxlu ThreadLocalBaxılıb 93

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.

Java-da ThreadLocal

ThreadLocal, hər birinin olduğu Java paralellik texnikadır sap öz dəyişənlərinə malikdir. Başqa sözlə, birdən çox mövzu eyni kodu oxuyursa, bir-birinin yerli dəyişkənlərini oxuya və yaza bilmir. Bu o deməkdir ki, hər bir mövzu yalnız öz dəyişənlərini oxuya və yaza bilər. Bu dəyişməz siniflər yaratmaq əvəzinə iplik təhlükəsizliyinə nail olmağın ən sadə yoludur. Java ThreadLocal dəyişənlər əhatə dairəsi mövzu daxilində olan hər zaman özəl və statikdirlər.

Java-da ThreadLocalPin

ThreadLocal'ın qurucuları

ThreadLocal, Java-da boş bir dəyişən yaradan yalnız bir konstruktora malikdir.

ThreadLocal tl = new ThreadLocal();

ThreadLocal metodları

Aşağıda Java-da ThreadLocal metodları verilmişdir.

Üsultəsvir
Tamsayı almaq ()Cari ipin lokal dəyişəninin dəyərini qaytarır
ləğv et ()Cari ipin lokal dəyişəninin dəyərini silir
boşluq dəsti (tam dəyər)Göstərilən dəyəri cari iş parçasının lokal dəyişəninə təyin edir
ThreadLocal withInitial (Təchizatçı təchizatçısı)Yeni bir mövzu lokal dəyişən yaradır

ThreadLocal'ın üstünlükləri

  • Çox oxlu vəziyyətini obyektlər arasında paylaşmadığı üçün daha asandır.
  • Mövzu təhlükəsizliyinə nail olur
  • Sinxronizasiya tələb etmir

ThreadLocal-ın dezavantajları

  • Dərslər arasında birləşməni gizlədir
  • Görmə məhdudluğu səbəbindən ThreadLocal-dan sui-istifadə edir

Misal: ThreadLocal yaradın, qurun və əldə edin

Bu nümunədə, ThreadLocal dəyişəninin dəyərinin necə yaradılacağını, qurulacağını və alınacağını görəcəyik. Əvvəlcə Integer tipli bir ThreadLocal dəyişənini yaradırıq. İçəridə run() üsulu ilə dəyişən dəyəri artırırıq və set() metod. İstifadə edərək dəyəri ala bilərik get() metod. Thread sinifindən istifadə edərək 2 mövzu yaradırıq run() üsul istifadə start().

public class ThreadLocalDemo {

  public static void main(String[] args) {
    ThreadDemo td = new ThreadDemo();
    
    Thread t1 = new Thread(td);
    Thread t2 = new Thread(td);
    
    t1.start();
    t2.start();
    
  }

}

class ThreadDemo implements Runnable {
  
  private ThreadLocal<Integer> tl = new ThreadLocal<Integer>();
  private int num = 10;

  @Override
  public void run() {
    
    tl.set(num++);
    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    System.out.println("ThreadLocal variable value: " + tl.get());
    
  }
  
}
ThreadLocal variable value: 11
ThreadLocal variable value: 10

Nümunə: çıxar () metodu

The remove() metod müvafiq mövzu üçün ThreadLocal dəyişəninin dəyərini silir.

public class ThreadLocalDemo {

  public static void main(String[] args) {
    ThreadDemo td = new ThreadDemo();
    
    Thread t1 = new Thread(td);
    Thread t2 = new Thread(td);
    
    t1.start();
    t2.start();
    
  }

}

class ThreadDemo implements Runnable {
  
  private ThreadLocal<Integer> tl = new ThreadLocal<Integer>();
  private int num = 10;

  @Override
  public void run() {
    
    tl.set(num++);
    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    System.out.println("ThreadLocal variable value: " + tl.get());
    tl.remove();
    System.out.println("ThreadLocal variable value: " + tl.get());
    
  }
  
}
ThreadLocal variable value: 10
ThreadLocal variable value: 11
ThreadLocal variable value: null
ThreadLocal variable value: null

Misal: initialValue () metodu

The initialValue() metod java ThreadLocal dəyişəninin ilkin dəyərini qaytarır. Bu nümunədə lokal dəyişən dəyəri başlanğıc vəziyyətinə gətirərək artırırıq initialValue() metod. Buna görə hər dəfə get() metod, yerli dəyişənin artan dəyərini qaytarır. Bu şəkildə, istifadə etməzdən əvvəl dəyərləri işə sala bilərik set() metodu.

public class ThreadInitialValueDemo {

  public static void main(String[] args) {
    ThreadEx t1 = new ThreadEx("Thread 1");
    ThreadEx t2 = new ThreadEx("Thread 2");
  }
  
  
}
class ThreadEx extends Thread {
  
  private static int num = 20;
  private static ThreadLocal t = new ThreadLocal() {
    protected Object initialValue() {
      return new Integer(num ++);
    }
  };
  
  public void run() {
    System.out.println(t.get());
  }
  
  ThreadEx(String name){
    super(name);
    start();
  }
  
}
20
21

Təchizatçı Tətbiqi

Təchizatçı tətbiqindən istifadə edərək Java-da ThreadLocal dəyişəninin dəyərini işə salmağın başqa bir üsulu var. Təchizatçı interfeysi olan statik bir zavod üsuluna malikdir withInitial(). Bundan istifadə edərək yerli dəyişənə ilkin dəyərlər verə bilərik. Təchizatçı funksional bir interfeys olduğundan lambda ifadəsini istifadə etmək hər zaman tövsiyə olunur.

Aşağıdakı nümunədə yerli dəyişən üçün başlanğıc edilmiş cari milisaniyə vaxtı göstərilir.

public class SupplierInitialValue {

  public static void main(String[] args) {
    Demo d1 = new Demo();
    Demo d2 = new Demo();
    d1.start();
    d2.start();
  }
}

class Demo extends Thread {
  ThreadLocal<String> tl = ThreadLocal.withInitial(() -> String.valueOf(System.currentTimeMillis()));
  
  public void run() {
    System.out.println(tl.get());
    
    try {
      Thread.sleep(2000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }	    
}
1614477848700
1614477848699

Ümumi ThreadLocal

Ümumi ThreadLocal, göstərilən tipdə dəyişənlər yaratmağa kömək edir. Məsələn, aşağıdakı kodda dəyişən yalnız qəbul edir simli tipli məlumatlar.

ThreadLocal<String> tl = new ThreadLocal<String>();
tl.set("Welcome");
String text = tl.get();

nəticə

Bu təlimatda, çox işləməli bir mühitdə istifadə edilən paralellik texnikası olan Java-da ThreadLocal dəyişənini müzakirə etdik.

arayış

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