Что сложнее, синхронизируя 2 потока или 1000 потоков?

На Paul Tyma презентация, я нашел вопрос для интервью:

Что сложнее, синхронизировать 2 потока или синхронизировать 1000 потоков?

С моей точки зрения, конечно, синхронизация 1000 потоков сложнее, но я не могу придумать веских причин для этого, помимо "конечно". Но поскольку это вопрос интервью, возможно, я ошибаюсь (вопросы интервью должны быть сложными, не так ли?).

Ответ 1

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

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

Ответ 2

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

Но, с другой стороны, синхронизация 1000 потоков без участия в конфликтах с конфликтами намного сложнее, чем когда есть только 2.

Реальный ответ: "Синхронизация потоков сложна различными способами, периодом".

Ответ 3

В интервью я бы сказал, что "ровно два потока" - очень полезный частный случай многопоточности. Такие вещи, как голод и инверсия приоритетов, могут встречаться всего лишь с тремя потоками, но только с двумя приоритетами инверсии приоритетов и голодания никогда не может произойти (ну, голод может произойти, если поток освобожден и снова закроется блокировка, не дав другой нити начать, но с три потока голода могут возникать, даже если блокировки захватываются мгновенно, когда они доступны). Переход от 2 нитей к 3 - это больший прыжок, чем от 3 до 1000.

Ответ 4

Почему синхронизация 1000 потоков будет сложнее, чем синхронизация 2 потоков?

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

Вам не нужно будет добавлять код синхронизации (если вы все делаете правильно).

Ответ 5

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

Ответ 6

Это зависит от того, что означает "проще". Сложность механизмов проектирования/блокировки примерно одинакова.

Говоря, я думаю, что 1000 потоков программ могут быть легче отлаживать. Уязвимые расовые условия имеют более высокую вероятность возникновения и, вероятно, будут легче воспроизвести. Состояние гонки в двух потоках может появляться только раз в 5 лет, если луна заполнена и вы в отпуске.

Ответ 7

У меня есть два ответа.

  • CASE 1: Использовать существующие ресурсы: Синхронизация 2 потоков - это такая же сложность, как синхронизация 1000 потоков, поскольку существующие созданы для синхронизации произвольного количества потоков.
  • CASE 2: Реализация из Scratch Кажется очевидным, что если вам нужно было внедрить систему синхронизации с нуля, было бы проще создать систему потоков 2.

Ответ 8

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

Однако хороший код синхронизации должен работать для любого количества потоков. В некоторых случаях, как и взаимное исключение, вы можете добавить ключевое слово с синхронизацией Java, и оно будет жестким для 2 потоков, как для 1000.

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

Ответ 9

Это один из тех вопросов, на который единственный реальный ответ - "это зависит". В этом случае это зависит от того, что вы делаете с ними.

Сценарий может быть таким же простым, как один рабочий рабочий поток, который переднего плана ждет при отображении индикатора выполнения. Или это может вызвать 1000 потоков и просто ждать, пока они все закончат, прежде чем делать что-то еще.

В качестве альтернативы, если всего лишь два потока обращаются к общим ресурсам, то концепции одинаковы. Вы должны быть очень осторожны с проблемами concurrency и стратегиями блокировки, будь то 2 или 1000. Независимо от того, сколько потоков больше одного, вы не можете гарантировать, что что-то еще не пытается одновременно читать или писать на тот же ресурс, который вы.

Ответ 10

Я бы согласился с теми, кто заявлял "это зависит". Если потоки идентичны, тогда не может быть такой большой разницы между 2 и 1000 потоками. Однако, если есть несколько ресурсов, которые нуждаются в взаимно эксклюзивном доступе (синхронизированном в терминах Java), тогда вероятность взаимоблокировок может увеличиваться с увеличением количества потоков.

Ответ 11

Когда я просмотрел ваши ответы, я нашел несколько интересных ударных. Думаю, на собеседовании это важнее, чем ответ: преобразование, жесты.

Ответ 12

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

Надеюсь, что это помогло

Ответ 13

Объекты синхронизируются не потоками. Создание синхронизированного метода или кодового блока предотвращает одновременное выполнение несколькими потоками области - поэтому не имеет значения, есть ли 2, 1,000 или 1,000,000 потоков.

С точки зрения производительности, если вы ожидаете удвоить parallelism (половина времени выполнения), когда вы удвоите количество потоков, тогда любая синхронизированная область будет иметь шею бутылки с точки зрения производительности, поскольку она по существу является серийной код, который не может быть распараллелен.

Ответ 14

Если вы используете язык программирования, например Scala, с шаблоном проектирования Актеров, вам не нужно ничего синхронизировать. http://www.scala-lang.org/node/242

Другой вариант (в Java) - это пойти с механизмом сравнения и замены/установить http://en.wikipedia.org/wiki/Compare-and-swap, чтобы вам не приходилось синхронизировать любые потоки в том, что они являются атомной переменной, которую вы сравниваете и просматриваете (не блокируете), и только блокируете/ждите при записи, что может получить огромную прибыль от производительности на основе вашего решения.