Банкомат

  • 9
  • Недоступна
Разберись, как работает программа Во время тестирования лог содержит следующее: ..... Добавляем 100, на счету 1100 Добавляем 100, на счету 1200 Тратим 1000, на счету 100 Недостаточно денег ..... Создан баг: При списании денег со счета теряются деньги Найти и исправить ошибку
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (103)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
VitalyK #111612422 уровень
20 сентября, 10:22
есть подсказка в требовании Но тут можно решить просто используя логику... деньги вносятся и деньги забираются - и конечно, эти действия должны быть синхронизированы.
omat_kisat20 уровень, MIPS Assembly
11 сентября, 14:01
Не задача, а прямо жиза-пережиза: добавляем 1000, тратим десять дней в день по 100, еще 20 дней недостаточно денег(((
Ilya Sergeev20 уровень, Санкт-Петербург
31 августа, 17:34
Если пометить поле balance в классе BankAccount как volatile, то результат работы программы будет тот же, и программа, по сути, будет работать правильно. Но валидацию ты не пройдешь)))
Никита30 уровень, Днепр
8 сентября, 20:50
+1. Сделал так же. Но валидатор сказал "не сегодня") На самом деле часто дают сильную подсказку в проверках (поэтому читаю их не сразу).
Artem Boyarshinov19 уровень, Москва
позавчера, 08:06
Этого недостаточно, необходимо еще и переменную account объявить как volatile.
Максим28 уровень, Черкассы
16 августа, 11:37
не понятно. Что должно поменяться? У меня с синхронизаторами в разных местах и без них ничего не меняется. Выглядит одинаково.
Тратим 100, на счету 300
Тратим 100, на счету 200
Тратим 100, на счету 100
Тратим 100, на счету 0
Недостаточно денег
Недостаточно денег
В условии задачи речьидет о какой-то потере ста денег, причем 100 прибавляем, а тысячку вычитаем...
Во время тестирования лог содержит следующее:
.....
Добавляем 100, на счету 1100
Добавляем 100, на счету 1200
Тратим 1000, на счету 100
Недостаточно денег
Katruk Dima20 уровень
23 сентября, 09:51
иногда бывает тратит по сотне с уже пустого счёта
John Doe19 уровень, Одесса
1 августа, 10:24
Сначала валидатор бьет по рукам за любое отклонение от условий задачи. Потом для исправления бага "При списании денег со счета теряются деньги." нужно исправить ещё и метод, зачисляющий деньги на счет. Не надо так.
Alexandr Racov27 уровень
6 июня, 17:56
А разве не должен еще и метод deposit синхронизироваться? Ведь, если Один из потоков будет снимать деньги, а в это время поток addMoney может закидывать денег, можем получить неожиданный результат. Доступ к изменению переменной balance у нас имеют оба метода и deposit и withdraw.
Павел27 уровень, Санкт-Петербург
31 мая, 09:47
newBalance.compareTo(BigDecimal.ZERO) < 0
а что значит биг синимал ЗЕРО??? я уже весь инет облазал.....
Игорь Ким36 уровень, Тольятти
3 июня, 16:50
Константа класса BigDecimal равная нулю
Павел27 уровень, Санкт-Петербург
3 июня, 18:26
спасибо))
fedor23 уровень, Москва
18 апреля, 20:22
сцк, лямбдами уже кроют...
private static Thread addMoney =  run() -> {
Wladyslaw26 уровень, Warsaw
21 июля, 12:44
Это анонимный класс, вроде как
Nail27 уровень, Кельн
25 июля, 21:31
ложная тревога, это еще не лямбда
Serhii Harasymiv26 уровень
21 марта, 07:06
Це нормально що я мало що можу розібрати в цьому коді, не маючи досвіду програмування взагалі?))) дуже сильно демотивує))
Alexander Fominsky20 уровень, Санкт-Петербург
9 июля, 16:05
Джавараш вообще учит побольше гуглить, поменьше писать. Подозреваю что готовят к реальной жизни. Типа "Ваша задача не код разбирать, а решение сделать": •В методе withdraw(BigDecimal money), если необходимо, используй synchronized. •В методе deposit(BigDecimal money), если необходимо, используй synchronized. Слишком просто.
TheDIP23 уровень, Киев
15 февраля, 17:54
Вообщем что я понял из разбора задачи, может кто-то тоже над этим думает. Обьект(статическая переменная), в нашем случае
static BankAccount account = new BankAccount("Amigo");
МОЖЕТ использоваться для вызова 1) синхронизированного 2) и не синхронизированного методов одновременно (разными потоками) Рефер на документацию: First, it is not possible for two invocations of synchronized methods on the same object to interleave. When one thread is executing a synchronized method for an object, all other threads that invoke synchronized methods for the same object block (suspend execution) until the first thread is done with the object. https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html Правда тут сказано про 2 синхронизированных метода, что они не могут использоваться, но я протестил и синхронизированный и не синхронизированный могут. Такие дела.