/
dmmitrii
/
multithreading
Обзор
Документация
Войти
/
dmmitrii
/
multithreading
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
ConfigEditor.java
84 строки
3 KB
dmmitrii
multithreading
16 май 2025, 00:38
16 май 2025, 00:38
800c917
Код
Авторство
О чём код?
package multithreading; /** * Класс {@code ConfigEditor} моделирует ситуацию с двумя разработчиками, * которые пытаются получить эксклюзивный доступ к одному конфигурационному * файлу для редактирования. * * Если один разработчик видит, что другой тоже хочет редактировать файл, * он уступает право доступа, чтобы дать возможность другому начать работу. * */ public class ConfigEditor { static class ConfigFile { private Developer owner; public ConfigFile(Developer owner) { this.owner = owner; } public synchronized Developer getOwner() { return owner; } public synchronized void setOwner(Developer d) { this.owner = d; } public synchronized void edit() { System.out.println(owner.getName() + " is editing the config file..."); } } static class Developer { private final String name; private boolean waitingToEdit = true; public Developer(String name) { this.name = name; } public String getName() { return name; } public boolean isWaitingToEdit() { return waitingToEdit; } public void work(ConfigFile file, Developer colleague) { while (waitingToEdit) { if (file.getOwner() != this) { try { Thread.sleep(1); } catch (InterruptedException e) { continue; } continue; } if (colleague.isWaitingToEdit()) { System.out.println(name + ": Please, " + colleague.getName() + ", you edit first."); file.setOwner(colleague); continue; } file.edit(); waitingToEdit = false; System.out.println(name + ": Done editing."); file.setOwner(colleague); } } } public static void main(String[] args) { Developer alice = new Developer("Alice"); Developer bob = new Developer("Bob"); ConfigFile sharedConfig = new ConfigFile(alice); new Thread(() -> alice.work(sharedConfig, bob)).start(); new Thread(() -> bob.work(sharedConfig, alice)).start(); } }