powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Задача с собеседования
10 сообщений из 35, страница 2 из 2
Задача с собеседования
    #38462326
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В дойчебанке просят имплементировать функцию transer(from,to,amount) свободную от дедлоков.
...
Рейтинг: 0 / 0
Задача с собеседования
    #38462345
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪВ дойчебанке просят имплементировать функцию transer(from,to,amount) свободную от дедлоков.
Кстати, да. Ещё одна хорошая причина использовать CAS. Я таки был не прав на счет блокировки. CAS выходит лучше со всех сторон.
...
Рейтинг: 0 / 0
Задача с собеседования
    #38462452
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪВ дойчебанке просят имплементировать функцию transer(from,to,amount) свободную от дедлоков.
и с возможностью послать одновременно в обе стороны по 100 евро?
...
Рейтинг: 0 / 0
Задача с собеседования
    #38462543
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если мне не изменяет память, то задача перевода с одного аккаунта на другой от и до рассмотрена в Java Concurrency in Practice
...
Рейтинг: 0 / 0
Задача с собеседования
    #38462607
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЯ таки был не прав на счет блокировки. CAS выходит лучше со всех сторон.
Эта транзакция полностью детерминирована на начальный момент - поэтому проблем с дедлоком можно избежать блокируя в определенном порядке (например по возрастанию номеров аккаунтов). Так что блокирование в этом смысле не столь плачевно, чем в случае, когда операнды возникают по ходу пьесы.
...
Рейтинг: 0 / 0
Задача с собеседования
    #38462621
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪВ дойчебанке просят имплементировать функцию transer(from,to,amount) свободную от дедлоков.
Можно в каждом потоке просто логгировать бизнес-операции с указанием сигналов
точного времени в микросекундах.

Здесь барьером будет только обращение к системному таймеру и...
и конечно-же процедура мёрджа бизнес-операций в конце опер-периода.

Ну и ... цена вопроса - когда мёржить.
...
Рейтинг: 0 / 0
Задача с собеседования
    #38462702
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrew1411для такого мультивалютного счета, я бы лучше написал такой код (беглый рефакторинг)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public class Account { 
    ...
    private AtomicLong getPrevCurrencyBalance(String currency){
    	if(currencyBallance.get(currency) == null)
    		currencyBallance.putIfAbsent(currency, new AtomicLong(0));
    	return currencyBallance.get(currency);
    }
}


Извините, но это же трэшачок. У вас здесь лютый race condition, ибо вы вы делаете классический неатомарный read-modify-write, хоть каждая отдельная операция и атомарна. Вот корректная имплементация:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class Account { 
    ...
    private AtomicLong getPrevCurrencyBalance(String currency){
        AtomicLong newVal = new AtomicLong(0);

        AtomicLong oldVal = currencyBalance.putIfAbsent(currency, newVal);

        return oldVal != null ? oldVal : newVal;
    }
}


Если напрягает создание нового AtomicLong каждый раз, то вот так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class Account { 
    ...
    private AtomicLong getPrevCurrencyBalance(String currency){
        AtomicLong oldVal = currencyBalance.get(currency);

        if (oldVal == null) {
            AtomicLong newVal = new AtomicLong(0);

            oldVal = currencyBalance.putIfAbsent(currency, newVal);

            return oldVal != null ? oldVal : newVal;
        }
        else
            return oldVal;
    }
}

...
Рейтинг: 0 / 0
Задача с собеседования
    #38462708
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, не. Гонки нет. Просто непонятно зачем вы 3 раза лезите в конкурентную коллекцию, хотя это можно сделать за 1 раз, если не жалко закинуть AtomicLong в GC, или 2 раза, если таки жалко.
Игнорирование результата операций типа compareAndSet, putIfAbsent или replace - это в 95% случаев code smell, то есть какая-то хрень в коде.
...
Рейтинг: 0 / 0
Задача с собеседования
    #38463124
igorolv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обсуждать задачу в контексте банковской бизнес-логики смысла не имеет:

- прежде всего, многопоточность тут вообще не при делах, т.к. количество jvm существенно больше одной в подобных системах.
- остаток счета в виде одной цифры также не имеет смысла, - нужно держать информацию о каждом движении, изменяющем остаток по счету
- есть счета, остатки по которым меняются очень часто, причем если по счетам доходов банка актуализировать остатки не надо, то, например, по счету кассы подразделения - надо.
- счета одновалютные. мультивалютный счет - это просто несколько счетов, открытых к одному договору.
- конверсия - отдельная тема, с остатками по счетам не связанная.

Поэтому, данную задачу следует рассматривать исключительно как задачу на многопоточность.
...
Рейтинг: 0 / 0
Задача с собеседования
    #38463939
mikhail_zh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за замечания, коллеги,

1)Эксепшоны надо, конечно, делать checked. И getPrevCurrencyBalance в отдельном методе выглядит посмпотичнее
2)Еще понравилась идея с енумами, на первый взгляд неочевидная, вкупе с AtomicArray интересно может получиться.
...
Рейтинг: 0 / 0
10 сообщений из 35, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Задача с собеседования
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]