Java.

Есть читальный зал, 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();
        }
    }
}
 

Warface Statistics.png Assistant for Apex Legends.png Assistant PUBG.png

от STILET