
Версия 2.1:
package lab_3;
import java.util.concurrent.locks.*;
public class SynchronizedString {
private String data;
private boolean isWriting;
private int numActiveReaders;
private Lock lock;
private Condition canWrite;
private Condition canRead;
public SynchronizedString() {
data = "";
isWriting = false;
numActiveReaders = 0;
lock = new ReentrantLock();
canWrite = lock.newCondition();
canRead = lock.newCondition();
}
public void write(String newData) throws InterruptedException {
lock.lock();
try {
while (isWriting) {
canWrite.await();
}
isWriting = true;
while (numActiveReaders > 0) {
canRead.await();
}
data = newData;
isWriting = false;
canWrite.signal();
} finally {
lock.unlock();
}
}
public String read() throws InterruptedException {
lock.lock();
try {
while (isWriting) {
canRead.await();
}
numActiveReaders++;
String result = data;
numActiveReaders--;
if (numActiveReaders == 0) {
canWrite.signal();
}
return result;
} finally {
lock.unlock();
}
}
}
--------------
public static void main(String[] args) {
SynchronizedString synchronizedString = new SynchronizedString();
Scanner scanner = new Scanner(System.in);
// Ввод количества потоков писателей и читателей
//System.out.print("Введите количество потоков писателей: ");
//int numWriters = scanner.nextInt();
int numWriters = 3;
//System.out.print("Введите количество потоков читателей: ");
//int numReaders = scanner.nextInt();int numReaders
int numReaders = 500;
// Создание и запуск потоков-писателей
for (int i = 0; i < numWriters; i++) {
final int writerNumber = i + 1;
Thread writerThread = new Thread(() -> {
try {
synchronized (synchronizedString) {
//System.out.print("Введите строку для потока писателя " + writerNumber + ": ");
//String input = scanner.next();
String input = "ЗДЕСЬ ПОТОК НОМЕР " + Integer.toString(writerNumber) + "!";
synchronizedString.write(input);
System.out.println("Writer Thread " + writerNumber + ": Успешно записал '" + input + "'");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
writerThread.start();
}
// Создание и запуск потоков-читателей
for (int i = 0; i < numReaders; i++) {
final int readerNumber = i + 1;
Thread readerThread = new Thread(() -> {
try {
synchronized (synchronizedString) {
String value = synchronizedString.read();
System.out.println("Reader Thread " + readerNumber + ": Прочитано значение: " + value);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
readerThread.start();
}
}