Если я создаю классы, которые используются в настоящее время только в одном потоке, я должен делать их потокобезопасными, даже если я не нуждаюсь в том, что в данный момент? Может случиться, что я позже использую этот класс в нескольких потоках, и в то время я мог получить условия гонки и, возможно, нелегко их найти, если бы я не сделал класс потокобезопасным в первую очередь. Или я должен сделать класс небезопасным для повышения производительности? Но преждевременная оптимизация - это зло.Должен ли я всегда делать свой Java-код потокобезопасным или по соображениям производительности делать это только тогда, когда это необходимо?
Иными словами, я должен сделать свои классы поточно-безопасными, если необходимо (если они используются в нескольких потоках, в противном случае нет), или мне нужно оптимизировать эту проблему, если это необходимо (если я вижу, что синхронизация поглощает важную часть времени обработки)?
Если выбрать один из двух способов, есть способы, чтобы уменьшить недостатки? Или существует третья возможность, которую я должен использовать?
EDIT: Я приводил причину, по которой этот вопрос пришел мне на ум. В нашей компании мы создали очень простое пользовательское управление, которое записывает данные в файлы свойств. Я использовал его в веб-приложении, и после некоторой работы над ним я получил странные ошибки, что пользователь-менеджмент забыл о свойствах пользователей (включая имя и пароль) и роли. Это было очень раздражающим, но не постоянно воспроизводимым, поэтому я считаю, что это было состояние гонки. Поскольку я синхронизировал все методы чтения и записи с/на диске, проблема исчезла. Поэтому я подумал, что, вероятно, я мог бы избежать всех хлопот, если бы мы сначала записали класс с синхронизацией?
EDIT 2: Когда я просматриваю советы прагматичного программиста, я видел совет # 41: Всегда создавайте параллелизм. Это не говорит о том, что весь код должен быть потокобезопасным, но он говорит, что дизайн должен иметь параллелизм в виду.
Что-то, что поможет вам в анализе, не думать о параллелизме как о преждевременной оптимизации, а скорее о производительности, связанной с BigO. Преждевременные наблюдения оптимизации-зла относятся к людям, которые разворачивают петли или критические условные конструкции, если условные конструкции в C/C++, которые невозможно расшифровать и поддерживать, и могут не дать вам какого-либо выигрыша по производительности после того, как компилятор завершил работу с кода (или в java runtime JIT). – reccles 2009-11-10 22:53:52