Почему были добавлены классы в Java, которые не являются потокобезопасными? - PullRequest
4 голосов
/ 31 марта 2011

Я вижу много классов, добавляемых в Java, которые не являются поточно-ориентированными.

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

Также различные классы коллекций не являются поточно-ориентированными.

Разве не безопасна работа с потоками?

Или я просто глуп и еще не понимаю, что значит быть потокобезопасным?

Ответы [ 5 ]

11 голосов
/ 31 марта 2011

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

Вы можете прочитать эту статью, чтобы узнать основы безопасности потоков:

http://en.wikipedia.org/wiki/Thread_safety

Если вам достаточно комфортно с темами или нет, подумайте над прочтением этой книги, у нее есть отличные отзывы:

http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601

4 голосов
/ 31 марта 2011

Некоторые классы не подходят для использования в нескольких потоках.StringBuffer - один из них, IMHO.

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

3 голосов
/ 31 марта 2011

Потокобезопасность не является свойством «все или ничего». Десять лет назад некоторые книги рекомендовали помечать все методы класса как синхронизированные, чтобы сделать их потокобезопасными. Это стоит некоторой производительности, но это далеко не гарантия того, что ваша общая программа является поточно-ориентированной. Следовательно, у вас есть расходы с сомнительной прибылью. Именно поэтому в библиотеку Java все еще добавляются классы, которые не являются поточно-ориентированными.

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

2 голосов
/ 31 марта 2011

Типичное использование StringBuilder выглядит примерно так:

return new StringBuilder().append("this").append("that").toString()

все в одном потоке, ничего синхронизировать не нужно.

2 голосов
/ 31 марта 2011

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

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