Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Перечислите все проблемы, которые вы видите в данном коде / 23 сообщений из 23, страница 1 из 1
22.06.2018, 17:33
    #39664377
_taylor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
Добрый день!

Может кто особо опытной в многопоточности java расскажет какие проблемы с кодом:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public abstract class Digest {
    private Map<byte[], byte[]> cache = new HashMap<byte[], byte[]>();
    public byte[] digest(byte[] input) {
        byte[] result = cache.get(input);
        if (result == null) {
            synchronized (cache) {
                result = cache.get(input);
                if (result == null) {
                    result = doDigest(input);
                    cache.put(input, result);
                }
            }
        }
        return result;
    }
    protected abstract byte[] doDigest(byte[] input);
}



Заранее спасибо!
...
Рейтинг: 0 / 0
22.06.2018, 17:45
    #39664382
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
_taylor,

new byte[1].equals(new byte[1]) возврашает false, что какбы намекает, что как ключ для Map тип данных byte[] не катит

нафига в этом месте заморачиваться с многопоточностью? ну вычислится оно несколько раз, ну и фиг с ним

сама идея кешировать данные из недоверенного источника, где не понятно сколько разных ключей может быть, попахивает ООМ
...
Рейтинг: 0 / 0
22.06.2018, 18:01
    #39664389
_taylor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
Андрей Панфилов,

авторнафига в этом месте заморачиваться с многопоточностью? ну вычислится оно несколько раз, ну и фиг с ним

ну типа потокобезопасность чтения и записи в Map, вдруг DigestImpl будет шариться между потоками, которые будут дергать метод digest(byte[] input)? не надо ли обеспечивать этот блок синхронным?
...
Рейтинг: 0 / 0
22.06.2018, 18:11
    #39664396
pavel_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
ключем HashMap должен быть неизменяемый объект, желательно с переопределенными hashCode() и equals()
...
Рейтинг: 0 / 0
22.06.2018, 18:11
    #39664397
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
_taylorну типа потокобезопасность чтения и записи в Map, вдруг DigestImpl будет шариться между потоками, которые будут дергать метод digest(byte[] input)? не надо ли обеспечивать этот блок синхронным?
ConcurrentHashMap для этого существует.
...
Рейтинг: 0 / 0
22.06.2018, 18:14
    #39664399
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
Если обернуть byte[] в класс, в кустарную синхронизацию заменить на готовое решение, кода станет меньше и он станет более читаемым. Да ещё и работособным.
...
Рейтинг: 0 / 0
22.06.2018, 18:17
    #39664403
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
_taylorну типа потокобезопасность чтения и записи в Map, вдруг DigestImpl будет шариться между потоками, которые будут дергать метод digest(byte[] input)? не надо ли обеспечивать этот блок синхронным?вы думаете не о том что нужно у вас:
ставим лок

вычисляем

записываем

снимаем лок

т.е. если вычисляем 10 минут, то все остальные в это время курят, нафига так делать если лишнее вычисление ни на что не влияет? Нужно:


вычисляем

ставим лок

записываем

снимаем лок

Далее, идем и курим доку по HashMap ( https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html): oracleNote that this implementation is not synchronized. If multiple threads access a hash map concurrently, and at least one of the threads modifies the map structurally, it must be synchronized externally. (A structural modification is any operation that adds or deletes one or more mappings; merely changing the value associated with a key that an instance already contains is not a structural modification.) This is typically accomplished by synchronizing on some object that naturally encapsulates the map.т.е. ваша оптимистичная проверка на наличие записи вообще не в кассу, потому что так нельзя, курим доку дальше, удаляем нафиг synchronized добавляем Collections.synchronizedMap.
...
Рейтинг: 0 / 0
22.06.2018, 18:39
    #39664413
_taylor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
Андрей Панфилов,

Ясно, спасибо за подробный ответ!
...
Рейтинг: 0 / 0
22.06.2018, 19:03
    #39664425
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
авторт.е. если вычисляем 10 минут, то все остальные в это время курят, нафига так делать если лишнее вычисление ни на что не влияет?
Если туда попадет 150 потоков одновременно, то вычислять будет те же 10 минут?
...
Рейтинг: 0 / 0
22.06.2018, 19:41
    #39664439
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
_taylor,

Велик шанс получить некорректное состояние HashMap. Ведь эта структура не расчитана на работу из двух потоков. Поэтому ошибка на первом же методе get.

Наивная оптимизация с null уже бесполезна.

Воспользуйтесь советом Андрея.
...
Рейтинг: 0 / 0
22.06.2018, 19:55
    #39664445
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
BlazkowiczЕсли обернуть byte[] в класс, в кустарную синхронизацию заменить на готовое решение, кода станет меньше и он станет более читаемым. Да ещё и работособным.Наверное смысла нет - нужно хеш от массива считать, а потом еще и equals делать, а у ТС дайджесты считаются - те же самые хеши, но другие.
...
Рейтинг: 0 / 0
22.06.2018, 20:29
    #39664452
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
Андрей ПанфиловНаверное смысла нет - нужно хеш от массива считать, а потом еще и equals делать, а у ТС дайджесты считаются - те же самые хеши, но другие.
Верояно замечание. Я фиг его знает что он там вычисляет. Но тоже нужно учитывать. Иначе смысл кеширования.
...
Рейтинг: 0 / 0
23.06.2018, 00:55
    #39664521
fixxer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
Очень похоже на тестовое задание от Яндекса.
...
Рейтинг: 0 / 0
23.06.2018, 02:23
    #39664532
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
_taylor
Код: java
1.
2.
3.
4.
5.
            synchronized (cache) {
                    result = doDigest(input);
            }

    protected abstract byte[] doDigest(byte[] input);




Вот это очень-очень плохо. Не рекомендуется передавать управление в сторонний код(а метод ваш абстрактный и по определению переопределяется в других классах), проблема не так сильна для внутренних классов, если же это часть фреймворка....
Тут можно словить много чего, начиная от дедлока, до злонамеренного DoS.
Как вам правильно сказали, нужно лочить, быстренько делать апдейт shared структуры данных и разлочить.
...
Рейтинг: 0 / 0
25.06.2018, 15:44
    #39665416
artas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
_taylor,

не совсем ясно, зачем выносить хэшмеп в свойства и заморачиваться с синхронайзом, засуньте кеш в функцию и уберите синхронайз.
...
Рейтинг: 0 / 0
25.06.2018, 20:50
    #39665577
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
с яндекса чтоль прислали?
...
Рейтинг: 0 / 0
25.06.2018, 21:34
    #39665597
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
fixxerОчень похоже на тестовое задание от Яндекса.
оно и есть. мне вот больше интересно что там за правильный ответ. потому что когда я им написал то что было самым популярнымИ ответамИ в гуглояндексе на их загадку - оказалось неправильным. я лично хз что там правильно.
...
Рейтинг: 0 / 0
26.06.2018, 10:07
    #39665749
_taylor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
andreykaT,

нет, но это особо значения не имеет.
да, задание тестовое, а не моя реализация кэша.
...
Рейтинг: 0 / 0
26.06.2018, 10:11
    #39665751
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
andreykaTоно и есть. мне вот больше интересно что там за правильный ответ. потому что когда я им написал то что было самым популярнымИ ответамИ в гуглояндексе на их загадку - оказалось неправильным. я лично хз что там правильно.
Какой ещё "правильный ответ"? Все ответы правильные. Чем больше вы проблем озвучите, тем больше раскроете свои знания потенциальному работодателю.
...
Рейтинг: 0 / 0
26.06.2018, 10:13
    #39665752
_taylor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
BlazkowiczВсе ответы правильные. Чем больше вы проблем озвучите, тем больше раскроете свои знания потенциальному работодателю.

так точно!
...
Рейтинг: 0 / 0
26.06.2018, 13:49
    #39666003
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
BlazkowiczandreykaTоно и есть. мне вот больше интересно что там за правильный ответ. потому что когда я им написал то что было самым популярнымИ ответамИ в гуглояндексе на их загадку - оказалось неправильным. я лично хз что там правильно.
Какой ещё "правильный ответ"? Все ответы правильные. Чем больше вы проблем озвучите, тем больше раскроете свои знания потенциальному работодателю.
правильный(правильные) это тот который они лично хотят услышать. очевидно же.
...
Рейтинг: 0 / 0
26.06.2018, 13:50
    #39666006
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
по мне так код вообще какой-то лютый костыль напоминает.
...
Рейтинг: 0 / 0
27.06.2018, 11:07
    #39666400
Valentin Kolesnikov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перечислите все проблемы, которые вы видите в данном коде
_taylorДобрый день!

Может кто особо опытной в многопоточности java расскажет какие проблемы с кодом:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public abstract class Digest {
    private Map<byte[], byte[]> cache = new HashMap<byte[], byte[]>();
    public byte[] digest(byte[] input) {
        byte[] result = cache.get(input);
        if (result == null) {
            synchronized (cache) {
                result = cache.get(input);
                if (result == null) {
                    result = doDigest(input);
                    cache.put(input, result);
                }
            }
        }
        return result;
    }
    protected abstract byte[] doDigest(byte[] input);
}



Заранее спасибо!

Вроде бы была такая задача. https://javatalks.ru/topics/45628

С уважением, Валентин
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Перечислите все проблемы, которые вы видите в данном коде / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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