Есть читальный зал, N читателей и M писателей. Читатели могут входить и выходить из читального зала и читать перед другими читателями, но тогда в читальном зале не может быть ни одного писателя. Писатели могут входить в читальный зал по одному, тогда в читальном зале может находиться только один писатель и ни один читатель.
Пожалуйста, решите проблему с:
- Семафоры
- Переменные условия
Рассмотрите случаи в пользу читателей, писателей и использования FIFO.
Проведите измерения для каждого решения для разного количества читателей (10–100) и писателей (от 1 до 10).
В отчете нарисуйте пожалуйста график времени в зависимости от количества потоков и интерпретируйте его.
package com.company; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class Main { static final int WRITERS_NUM = 100; static final int READERS_NUM = 1000; public static void main(String[] args) { Library library = new Library(); for (int i = 0; i < WRITERS_NUM; i++) { Thread threadWriter = new Thread(new Writer(library)); threadWriter.start(); } for (int i = 0; i < READERS_NUM; i++) { Thread threadReader = new Thread(new Reader(library)); threadReader.start(); } } } class Writer implements Runnable { private Library library; public Writer(Library library) { this.library = library; } @Override public void run() { library.startWrite(); library.endWrite(); } } class Reader implements Runnable { private Library library; public Reader(Library library) { this.library = library; } @Override public void run() { library.startRead(); library.endRead(); } } class Library { ReentrantLock reentrantLock; Condition conditionReader; Condition conditionWriter; int readers = 0; int writers = 0; public Library() { this.reentrantLock = new ReentrantLock(); this.conditionReader = reentrantLock.newCondition(); this.conditionWriter = reentrantLock.newCondition(); } public void startRead() { reentrantLock.lock(); try { while (writers > 0) { conditionReader.await(); } readers++; System.out.printf("Reading (Library status readers: %d writers: %d)\n", readers, writers); } catch (InterruptedException e) { e.printStackTrace(); } finally { reentrantLock.unlock(); } } public void endRead() { reentrantLock.lock(); try { System.out.println("End reading"); readers--; conditionWriter.signal(); conditionReader.signal(); } finally { reentrantLock.unlock(); } } public void startWrite() { reentrantLock.lock(); try { while (readers > 0 || writers > 0) { conditionWriter.await(); } writers++; System.out.printf("Writing (Library status readers: %d writers: %d)\n", readers, writers); } catch (InterruptedException e) { e.printStackTrace(); } finally { reentrantLock.unlock(); } } public void endWrite() { reentrantLock.lock(); try { System.out.println("End writing"); writers--; conditionReader.signal(); conditionWriter.signal(); } finally { reentrantLock.unlock(); } } }
![]()
![]()
![]()