Если я создаю классы, которые используются в данный момент только в одном потоке, я должен сделать их потокобезопасными, даже если мне это не нужно в данный момент? Может случиться, что я позже использую этот класс в нескольких потоках, и в то время я мог получить условия гонки и, возможно, нелегко их найти, если бы я не сделал класс потокобезопасным в первую очередь. Или я должен сделать класс небезопасным для повышения производительности? Но преждевременная оптимизация - это зло.
Иными словами, я должен сделать свои классы потокобезопасными, если это необходимо (если они используются в нескольких потоках, в противном случае - нет), или мне следует оптимизировать эту проблему, если это необходимо (если я вижу, что синхронизация поглощает важную часть времени обработки)
Если я выберу один из двух способов, есть ли способы уменьшить недостатки? Или существует третья возможность, которую я должен использовать?
РЕДАКТИРОВАТЬ. Я объясняю, почему этот вопрос пришел мне на ум. В нашей компании мы создали очень простое пользовательское управление, которое записывает данные в файлы свойств. Я использовал его в веб-приложении, и после некоторой работы над ним я получил странные ошибки, что пользователь-менеджмент забыл о свойствах пользователей (включая имя и пароль) и роли. Это было очень раздражающим, но не постоянно воспроизводимым, поэтому я считаю, что это было состояние гонки. Поскольку я синхронизировал все методы чтения и записи с/на диске, проблема исчезла. Поэтому я подумал, что мне, вероятно, удалось избежать всех хлопот, если бы мы сначала записали класс с синхронизацией?
EDIT 2. Когда я просматриваю советы прагматического программиста, я видел подсказку № 41: Всегда дизайн для Concurrency. Это не говорит о том, что весь код должен быть потокобезопасным, но он говорит, что дизайн должен иметь concurrency.