Java-da oxuyun


Java ReadWriteLockBaxılıb 96

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əlimat Java-dakı ReadWriteLock, onun metodları və ətraflı bir nümunədən istifadə edərək necə həyata keçirilməsini əhatə edir.

Java-da oxuyunPin

Java ReadWriteLock

ReadWriteLock bir interface bir hissəsi olan Java'da java.util.concurrent.locks paket. Bir neçə mövzuya paylaşılan bir mənbəni oxumağa imkan verən inkişaf etmiş bir kilid mexanizmidir, ancaq paylaşılan bir qaynaq yazmaq üçün yalnız bir mövzu. Dəstəkləyir çox oxlu paralellik problemlərinə səbəb olmadan.

Paralellik səhvlərindən qaçınmaq üçün Java-da ReadWriteLock tətbiq etmək üçün aşağıdakı qaydalara riayət etməliyik.

ReadLock: Birdən çox mövzuya eyni mənbəni oxumağa icazə verir və üzərində yazma-kilid istəməyən və ya oxuyan bir mövzu yoxdur.

WriteLock: Yalnız bir mövzuya yazma kilidi əldə etməyə imkan verir və eyni mənbədə oxu kilidinə sahib olan bir mövzu yoxdur.

Java ReadWriteLock tətbiqetmə sinfi

ReentrantReadWriteLock sinifi ReadWriteLock interfeysini həyata keçirir.

ReadWriteLock rl = new ReentrantReadWriteLock();

Java ReadWriteLock interfeysinin metodları

ReadLock kilidini kilidləyin ()

Paylaşılan mənbədə oxunma kilidi əldə etmək üçün bu kilidi istifadə edə bilərik. İstifadə readLock().lock() paylaşılan mənbəni oxumaq üçün kilidləyə biləcəyimiz metod. Mənbəni oxuduqdan sonra kilidini readLock().unlock() metodu.

ReadWriteLock rl = new ReentrantReadWriteLock();
rl.readLock().lock();
try {
  //code
}
finally {
  rl.readLock().unlock();
}

Yazı kilidini kilidləyin ()

Paylaşılan mənbədə yazma kilidi əldə etmək üçün bu kilidi istifadə edə bilərik. İstifadə writeLock().lock() paylaşılan mənbəni yazmaq üçün kilidləyə biləcəyimiz metod. Lazımi əməliyyatı etdikdən sonra kilidini writeLock().unlock() metodu.

ReadWriteLock rl = new ReentrantReadWriteLock();
rl.writeLock().lock();
try {
  //code
}
finally {
  rl.writeLock().unlock();
}

ReadWriteLock nümunəsi

İndi, sadə bir nümunədən istifadə edərək ReadWriteLock interfeysini və onun metodlarını necə istifadə edə biləcəyimizi görək. 2 metodumuz var addElements() siyahıya elementlər əlavə etmək və getElements() elementi göstərilən indeksdə əldə etmək. Elementləri siyahıya əlavə edərkən a yazınLock çünki biz bunu yazırıq. Eynilə elementi əldə etmək üçün oxumaq kilidi çünki məlumatları oxuyuruq.

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class ReadWriteLockDemo {
  
  private final ReadWriteLock rwl = new ReentrantReadWriteLock();
  private final Lock wl = rwl.writeLock();
  private final Lock rl = rwl.readLock();
  
  private final List<String> list = new ArrayList<String>();

  public static void main(String[] args) {
    ReadWriteLockDemo d = new ReadWriteLockDemo();
    d.addElements("Java");
    d.addElements("Python");
    d.addElements("Perl");
    
    System.out.println("Printing element in main thread: " + d.getElements(1));
  }
  
  public void addElements(String s) {
    wl.lock();
    
    try {
      list.add(s);
      System.out.println("Element " + s + " is added to the list");
    }
    finally {
      wl.unlock();
    }
  }
  
  public String getElements(int i) {
    rl.lock();
    
    try {
      System.out.println("Retrieve element at index " + i + ": " + list.get(i));
      return list.get(i);
    }
    finally {
      rl.unlock();
    }
  }

}
Element Java is added to the

siyahı

Element Python is added to the list
Element Perl is added to the list
Retrieve element at index 1: Python
Printing element in main thread: Python

İndi Java ReadWriteLock istifadə edərək sinxronizasiyanı təsvir etmək üçün çox işləməli konsepsiyadan istifadə etdiyimiz fərqli bir nümunə görək.

Bu nümunədə Read sinfi üçün 2, WriteOdd və WriteEven sinfi üçün hər biri 1 mövzu yaradırıq. Oxu sinfi yalnız "val" String dəyərini oxuyur. WriteOdd sinfi tək ədədi, WriteEven sinfi cüt ədədi yazır.

import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class ReadWriteLockExample {

  private static final ReadWriteLock rwl = new ReentrantReadWriteLock(true);
  private static String val = "1";
  
  public static void main(String[] args) throws InterruptedException {
    Thread t1 = new Thread(new Read(),"ReadThread1");
    Thread t2 = new Thread(new Read(),"ReadThread2");
    Thread t3 = new Thread(new WriteOdd(),"Write odd");
    Thread t4 = new Thread(new WriteEven(),"Write even");
    
    t1.start();
    t2.start();
    t3.start();
    t4.start();
    
    t1.join();
    t2.join();
    t3.join();
    t4.join();
  }
  
  static class Read implements Runnable {

    @Override
    public void run() {
      for(int i=1;i<=3;i++) {
        rwl.readLock().lock();
        System.out.println(Thread.currentThread().getName() + " --- Value: " + val);
        rwl.readLock().unlock();
      }
      
    }
    
  }

  static class WriteOdd implements Runnable {

    @Override
    public void run() {
      for(int i=1;i<=5;i+=2) {
        try {
          rwl.writeLock().lock();
          System.out.println("Writing Odd number");
          val = val.concat(" " + i);
        }
        finally {
          rwl.writeLock().unlock();
        }
      }
      
    }
    
  }
  
  static class WriteEven implements Runnable {

    @Override
    public void run() {
      for(int i=2;i<=6;i+=2) {
        try {
          rwl.writeLock().lock();
          System.out.println("Writing even number");
          val = val.concat(" " + i);
        }
        finally {
          rwl.writeLock().unlock();
        }
      }
      
    }
    
  }
}

Writing Odd number
ReadThread2 --- Value: 1 1
Writing even number
ReadThread1 --- Value: 1 1 2
Writing Odd number
Writing even number
ReadThread2 --- Value: 1 1 2 3 4
ReadThread1 --- Value: 1 1 2 3 4
Writing Odd number
Writing even number
ReadThread2 --- Value: 1 1 2 3 4 5 6
ReadThread1 --- Value: 1 1 2 3 4 5 6

Oxumağı da istəyə bilərsiniz Java-da çıxılmaz vəziyyət

arayış

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