Учебники

Параллелизм Java – интерфейс ReadWriteLock

Интерфейс java.util.concurrent.locks.ReadWriteLock позволяет читать несколько потоков одновременно, но одновременно может писать только один поток.

  • Блокировка чтения – если ни один поток не заблокировал ReadWriteLock для записи, то несколько потоков могут получить доступ к блокировке чтения.

  • Блокировка записи – если ни один поток не читает или не пишет, то один поток может получить доступ к блокировке записи.

Блокировка чтения – если ни один поток не заблокировал ReadWriteLock для записи, то несколько потоков могут получить доступ к блокировке чтения.

Блокировка записи – если ни один поток не читает или не пишет, то один поток может получить доступ к блокировке записи.

Методы блокировки

Ниже приведен список важных методов, доступных в классе Lock.

Sr.No. Метод и описание
1

public Lock readLock ()

Возвращает блокировку, используемую для чтения.

2

открытый замок writeLock ()

Возвращает блокировку, использованную для записи.

public Lock readLock ()

Возвращает блокировку, используемую для чтения.

открытый замок writeLock ()

Возвращает блокировку, использованную для записи.

пример

Следующая программа TestThread демонстрирует эти методы интерфейса ReadWriteLock. Здесь мы использовали readlock () для получения блокировки чтения и writeLock () для получения блокировки записи.

Live Demo

import java.util.concurrent.locks.ReentrantReadWriteLock;

public class TestThread {
   private static final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
   private static String message = "a";

   public static void main(String[] args) throws InterruptedException {
      Thread t1 = new Thread(new WriterA());
      t1.setName("Writer A");
      
      Thread t2 = new Thread(new WriterB());
      t2.setName("Writer B");
      
      Thread t3 = new Thread(new Reader());
      t3.setName("Reader");
      t1.start();
      t2.start();
      t3.start();
      t1.join();
      t2.join();
      t3.join();
   }

   static class Reader implements Runnable {

      public void run() {
         
         if(lock.isWriteLocked()) {
            System.out.println("Write Lock Present.");
         }
         lock.readLock().lock();

         try {
            Long duration = (long) (Math.random() * 10000);
            System.out.println(Thread.currentThread().getName() 
               + "  Time Taken " + (duration / 1000) + " seconds.");
            Thread.sleep(duration);
         } catch (InterruptedException e) {
            e.printStackTrace();
         } finally {
            System.out.println(Thread.currentThread().getName() +": "+ message );
            lock.readLock().unlock();
         }
      }
   }

   static class WriterA implements Runnable {

      public void run() {
         lock.writeLock().lock();
         
         try {
            Long duration = (long) (Math.random() * 10000);
            System.out.println(Thread.currentThread().getName() 
               + "  Time Taken " + (duration / 1000) + " seconds.");
            Thread.sleep(duration);
         } catch (InterruptedException e) {
            e.printStackTrace();
         } finally {
            message = message.concat("a");
            lock.writeLock().unlock();
         }
      }
   }

   static class WriterB implements Runnable {

      public void run() {
         lock.writeLock().lock();
         
         try {
            Long duration = (long) (Math.random() * 10000);
            System.out.println(Thread.currentThread().getName() 
               + "  Time Taken " + (duration / 1000) + " seconds.");
            Thread.sleep(duration);
         } catch (InterruptedException e) {
            e.printStackTrace();
         } finally {
            message = message.concat("b");
            lock.writeLock().unlock();
         }
      }
   }
}

Это даст следующий результат.