Как работать с несколькими потоками максимально эффективно и без синхронизации в Java? - PullRequest
2 голосов
/ 12 мая 2019

Существует сайт бронирования автобусов, на котором действует около 100 тыс. Потоков, но общее количество мест составляет всего 20. Как вы будете контролировать производительность и каков будет ваш подход в многопоточности Java?

Я ответил, что ябудет использовать методы синхронизации или блокировать, так как он будет управлять параллельными потоками, а блокировка предотвратит асинхронное выполнение.

Но интервьюер прервал меня и сказал, что синхронизация является фиктивной идеей, а производительность ухудшится, а она не поможет.

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

Ответы [ 3 ]

2 голосов
/ 12 мая 2019

Вы должны использовать семафор разрешений 20, это означает, что одновременно 20 пассажиров могут занимать места, если пассажиры рассматриваются как нить. Это может быть ответом только в случае многопоточности ядра Java.

1 голос
/ 12 мая 2019

Интервьюер, который задает такой вопрос, не ищет какого-то конкретного решения или идеи.Они хотят услышать, как вы рассуждаете о синхронизации.Разумный ответ мог бы быть:

С таким количеством потоков, очевидно, никто не заботится о производительности.Если вы заботитесь о производительности, уменьшите количество потоков.Они просто сражаются за один и тот же ресурс.

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

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

1 голос
/ 12 мая 2019

Этот вопрос не о понятии нити.Интервьюер на самом деле хочет, чтобы вы не использовали блокировку, потому что это сделает приложение очень медленным, если потоки 100 КБ обращаются к одному и тому же объекту.Этого можно добиться с помощью оптимистической блокировки (в jpa или hibernate).

Это достигается с помощью столбца версии в таблице базы данных с соответствующим атрибутом версии (аннотация @Version) в классе сущности.Когда строка изменяется, значение версии увеличивается.Исходная транзакция проверяет атрибут версии, и если данные были изменены другой транзакцией, будет выдано исключение javax.persistence.OptimisticLockException, а исходная транзакция будет откатана.Мы также можем использовать Date и timeStamp.

Пожалуйста, посмотрите здесь javaEE Блокировка сущностей docs.oracle.com

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...