powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Перечислите все проблемы, которые вы видите в данном коде
23 сообщений из 23, страница 1 из 1
Перечислите все проблемы, которые вы видите в данном коде
    #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
Перечислите все проблемы, которые вы видите в данном коде
    #39664382
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_taylor,

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

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

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

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

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

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

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

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

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

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




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

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

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

так точно!
...
Рейтинг: 0 / 0
Перечислите все проблемы, которые вы видите в данном коде
    #39666003
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczandreykaTоно и есть. мне вот больше интересно что там за правильный ответ. потому что когда я им написал то что было самым популярнымИ ответамИ в гуглояндексе на их загадку - оказалось неправильным. я лично хз что там правильно.
Какой ещё "правильный ответ"? Все ответы правильные. Чем больше вы проблем озвучите, тем больше раскроете свои знания потенциальному работодателю.
правильный(правильные) это тот который они лично хотят услышать. очевидно же.
...
Рейтинг: 0 / 0
Перечислите все проблемы, которые вы видите в данном коде
    #39666006
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по мне так код вообще какой-то лютый костыль напоминает.
...
Рейтинг: 0 / 0
Перечислите все проблемы, которые вы видите в данном коде
    #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
23 сообщений из 23, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Перечислите все проблемы, которые вы видите в данном коде
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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