Банкомат

  • 9
  • Недоступна
Разберись, как работает программа Во время тестирования лог содержит следующее: ..... Добавляем 100, на счету 1100 Добавляем 100, на счету 1200 Тратим 1000, на счету 100 Недостаточно денег ..... Создан баг: При списании денег со счета теряются деньги Найти и исправить ошибку
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (163)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
MR18 уровень, Харьков
Sunday, 17:19
какая-то странная задача больше в сам код вникала 2 часа. лазила по статьям, чтобы понять, что это за BigDecimal вообще такой, не помню, мы проходили его вообще или нет, вроде что-то знакомое. А сама задача вроде легкая, хотя затупила и добавила только один синхронайз, когда в мыслях-то и было добавить сразу два
Alexander Chevtaev20 уровень, Bogorodsk
2 July, 11:30
Валидатор капризничает, не хочет принимать рабочий код (синхронизировал ран класс SpendThread), пришлось делать как ему нужно. Но результат, на выходе, один и тот же.
space.trueper18 уровень, Москва
2 July, 09:33
Почему валидатор принимает решение без valotile balance? Этот модификатор же исправляет проблему описанную в условии задачи. Если один поток снимает деньги со счета, то он обновляет переменную balance, другие потоки об этом ничего не знают, снова обращаются к переменной, но т.к. старого значения там нет, а новое находится в кэше первого потока, который изменил значение переменной, другие потоки выдают что на балансе нет средств. Я что-то не понимаю или задача составлена с ошибкой?
Ильдар Дильмухаметов20 уровень, НАБЕРЕЖНЫЕ ЧЕЛНЫ
19 June, 21:23
Кто нибудь может объяснить, почему я не могу использовать мьютекс balance?
synchronized (balance) {
           BigDecimal newBalance = balance.add(money);
           System.out.println("Добавляем " + money + ", на счету " + newBalance);
           balance = newBalance;
       }
Вроде пока balance заблокирован, другие потоки не должны его менять.
Alexander Chevtaev20 уровень, Bogorodsk
2 July, 11:33
Я может чего-то не понимаю, но мне всегда казалось, что synchronized работает с потоками (в данной программе их три spendThread, spendThread1, spendThread2). Причем тут переменная balance?
Ильдар Дильмухаметов20 уровень, НАБЕРЕЖНЫЕ ЧЕЛНЫ
6 July, 19:40
При том что 3 потока взаимодействуют с балансом независимо. Экземпляр банк аккаунта один. Если заблокировать мьютекс баланса и давать последовательно потокам работать с общим ресурсом, по идее, все должно быть хорошо.
Vladislav19 уровень
19 June, 11:13
public synchronized void withdraw(BigDecimal money) throws NotEnoughMoneyException {
        BigDecimal newBalance = balance.add(money);
.....
}
Когда пытаешься использовать HESOYAM на другом уровне
Vitalachka20 уровень, Лондон
7 June, 17:50
так похоже на мой банковский счёт 😭
Dwarf18 уровень, Москва
2 June, 16:05
Сначала синхронизировала цикл в Thread addMoney и в Thread addMoney, ведь они тоже изменяют общие ресурсы account и addMoney. Получился красивый логичный вывод. Но валидатор настоял на синхроне других методов, и получилась дичь...Видимо я чего-то не понимаю😁
Игорь Birt18 уровень, Тирасполь
11 June, 08:19
Оба варианты верны. У меня такая же история случилась.
Yuriy Kulinich19 уровень, Киев
27 May, 11:28
Лайк, если тоже уменьшил задержку в потоке с депозитом :0)
terrorist8627 уровень, Николаев
23 May, 07:56
Ка по мне, логичней было бы синхронизировать методы - делегаты, поскольку именно они напрямую вызываются потоками. А делегируемые, в свою очередь, сделать private, чтоб к ним не было непосредственного доступа. Но валидатор такой вартант не принял. Пришлось сделать как требуют предписания.
Иван Плотников25 уровень, Санкт-Петербург
22 May, 15:27
По логике всё понятно. Но так как и изначальный вариант у меня ни разу из 10 запусков не выдал ошибку, проверить правильность внесённых изменений нет возможности и это нервирует.
Vitalachka20 уровень, Лондон
7 June, 17:53
когда не могу допереть до своих ошибок, прописываю System.out.println(с параметрами которые меня интересуют); и это часто помогает
Иван Плотников25 уровень, Санкт-Петербург
8 June, 08:26
Да, я тоже так делаю. Но тут это не очень помогало. Хотя, может имело смысл ещё поэксперементировать просто. =)