Після років заповнення форм і очікування ми нарешті отримали банківську ліцензію. Це означає, що тепер ми офіційно маємо право відкрити власний банк, ура!
Наш перший пріоритет - запустити IT-системи й налагодити їхню роботу. Після дня наполегливої праці ми вже можемо відкривати і закривати рахунки, а також обробляти зняття коштів і поповнення рахунку.
Оскільки нам не хотілося писати тести, ми запрошуємо кількох друзів допомогти протестувати систему. Однак уже за пʼять хвилин один із наших друзів заявляє, що втратив гроші! Хоча ми впевнені, що наш код без помилок, ми починаємо гортати логи, щоб розібратися.
Атож, саме як ми й підозрювали, винен наш друг! Він поділився своїми тестовими обліковими даними з іншим другом, і разом вони змовилися робити депозити та знімати кошти з одного рахунку паралельно. Хто б таке зробив?
Поки ми доводимо, що фізично неможливо, щоб хтось отримав доступ до свого рахунку паралельно, наш друг самовдоволено повідомляє, що банківські правила вимагають від нас це підтримувати. Отже, без підтримки паралельної роботи з рахунками не буде й сигналу до запуску. Зітхнувши, ми подумки занотовуємо, що завтра над цим треба попрацювати. Це відсуне дату запуску ще щонайменше на один день, але що ж...
Реалізуйте банківські рахунки, які підтримують відкриття/закриття, зняття та внесення грошей.
Оскільки до банківських рахунків можна отримувати доступ багатьма різними способами (через інтернет, мобільні телефони, автоматичні списання), банківське програмне забезпечення має давати змогу безпечно отримувати доступ до рахунків з багатьох потоків/процесів (термінологія залежить від обраної мови програмування) паралельно. Наприклад, багато внесень і знять можуть відбуватися паралельно; забезпечте, щоб не було станів гонки між читанням балансу рахунку та встановленням нового балансу.
Має бути можливість закрити рахунок; операції із закритим рахунком мають завершуватися помилкою.
Щоб розвʼязати цю вправу, ми будемо використовувати Mutex із базового пакета sync.
Команда мови підготувала приклад, з якого можна почати.