Есть ли список поточно-безопасных классов в Java?

Я пытаюсь применить уроки из чтения Java Concurrency на практике в отношении объявления, являются ли написанные мной классы поточно-ориентированными или содержат несинхронизированное изменяемое состояние. Я думаю, что это хорошая идея, потому что она документирует намерение использования класса.

Сегодня я написал класс, который оборачивает экземпляр java.lang.Class и java.net.URI. Я собирался написать в javadoc, что это потокобезопасный неизменяемый, так как оба поля были объявлены как окончательные ссылки. Тем не менее, я посмотрел на исходный код для URI и Class и не увидел никакого объявления о том, являются ли они потокобезопасными, и это не показалось сразу очевидным.

Думая об этом в более общем плане: существует ли список распространенных классов Java, в которых указано, являются ли они потокобезопасными или нет?

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

3 ответа

Решение

В Java нет определенного списка потоковобезопасных классов. Единственный человек, который мог бы составить окончательный список, был бы Oracle 1, и они не сделали этого.


1 - Oracle является хранителем как справочных библиотек классов Java (включая javadocs), так и другой "официальной" документации и… официального набора тестов на соответствие для Java. Они - люди, которые скажут, является ли класс (или подмножество класса) поточно-ориентированным, поточно-ориентированным по конструкции или это просто артефакт реализации. Никто другой не может сделать этот вызов с полной уверенностью; то есть должен ли класс, который является поточно-ориентированным в стандартной кодовой базе Oracle, также быть поточно-ориентированным в кодовой базе Harvest / Android или кодовой базе Classpath, или...

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

Впрочем, я никогда не слышал о списке поточно-безопасных классов JDK.

Все java.lang классы (как сказал Марко, неизменяемые классы считаются поточно-ориентированными). Также BigDecimal и BigInteger и еще несколько. К сожалению, нет списка этих классов.

Если вам нужны некоторые поточно-ориентированные коллекции, попробуйте неизменные коллекции Google Guava ( http://code.google.com/p/guava-libraries/wiki/GuavaExplained?tm=6).

Другие вопросы по тегам