2010-09-24 3 views
0

Если текст может измениться и будет доступен только из одной нити, используйте в StringBuilder, потому что StringBuilder не синхронизирован.Многопоточность - StringBuffer и StringBuilder

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

Что это значит для нескольких потоков? Может ли кто-нибудь объяснить мне об этом? Я имею в виду, что это то, что два метода или две программы пытаются получить доступ к другому методу в одно и то же время.

+2

http://en.wikipedia.org/wiki/Thread_%28computer_science%29 –

+2

Это означает, что, когда 2 или более потока обращаются к одному и тому же объекту в «то же время». Например, 1 поток может попытаться получить значение строки, а другой - обновить его. Это известная проблема «синхронизации». StringBuffer может быть любым объектом, к которому обращаются 2 или более потоков. – Andreas

ответ

4

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

Или, если у вас есть поле в этом объекте, все темы видят его. И если один из них изменяет поле ... вот когда начинается интересная часть :-) Другие темы могут видеть только обновленное значение позднее или вообще не будут, если вы специально не убедитесь, что его можно использовать несколькими потоки. Это может привести к тонким, трудновоспроизводимым ошибкам. Вот почему правильная запись параллельных программ - сложная задача.

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

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

Подробное описание потоков и процессов - и, далее, параллелизм в Java - можно найти в Java Tutorials.

+0

- это любая программа java нить или мы делаем ее – John

+0

@ Джон, ответ на это уже есть - теперь я подчеркнул ее полужирным шрифтом :-) –

+0

@John: Каждый независимый путь выполнения - это поток. Таким образом, по определению выполнение Java-программы, состоящей из ничего, кроме основного метода, также является потоком. – MAK

1

Threads похожи на процесс.

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

Оба они работают на нем. Таким образом, это будет случай, когда String обрабатывается обоими потоками, чтобы он не оставался в согласованном состоянии.

So.

  • StringBuffer предназначен для потокобезопасности, а все общедоступные методы в StringBuffer синхронизированы. StringBuilder не обрабатывает проблему безопасности потоков, и ни один из ее методов не синхронизирован.

  • В большинстве случаев StringBuilder имеет лучшую производительность, чем StringBuffer.

  • Используйте новый StringBuilder, где это возможно.

Более подробную информацию о параллельности см this

+0

Строка неизменна, она не может быть «под манипуляцией». Сама строка является потокобезопасной. –

+0

- это любая программа java нить, или мы делаем ее – John

+1

Каждая программа Java имеет хотя бы «главный» поток, который запускается основным классом. но может быть много других. –

1

Я думаю, что вы можете использовать StringBuilder в обоих случаях, но очень хорошо осведомлены в многопоточных программах. Синхронизация на уровне StringBuffer не подходит, когда вы должны делать больше операций над такой строкой (подумайте об этом как о транзакциях с базой данных), например, удалите 3 символа в начале, а затем удалите 3 символа в конце и сравните их с чем-то. Даже если такие операции удаления синхронизированы (при этом атомное) вы можете иметь:

  1. первый поток может получить такую ​​строку, и удалить 3 символов в начале
  2. второй нитки получить такую ​​строку и удалить 3 символов в начале
  3. строка не в согласованном состоянии (6 символов, удаленных от начала)

Вы должны синхронизировать доступ к таким переменным на вашем уровне методы, не полагаясь на StringBuffer синхронизации методы. Используя StringBuffer, у вас будет два уровня синхронизации, а с StringBuilder у вас будет только ваша собственная синхронизация.

0

Mu; ltiple threads - как ходовые части одной и той же программы одновременно с использованием одних и тех же данных.

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

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

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

Таким образом, это означает, что StringBuffer является синхронным, он блокирует доступ к потокам toher, когда один поток обновляет его.

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

Мой совет: держаться подальше оттуда, пока вы не прочтете хорошую книгу и не экспериментируете на упражнениях. Пока не будут делиться данными между потоками (кроме простейших сигнальных флагов).

Смежные вопросы