Несинхронизированные статические методы streamобезопасны, если они не изменяют переменные статического classа?

Мне было интересно, есть ли у вас статический метод, который не синхронизирован, но не модифицирует какие-либо статические переменные, является ли он streamобезопасным? Как насчет того, создает ли в нем локальные переменные? Например, является ли следующий код безопасным?

public static String[] makeStringArray( String a, String b ){ return new String[]{ a, b }; } 

Поэтому, если у меня есть два streamа, вызывающие метод постоянно и одновременно, один с собаками (скажем «великий датчанин» и «бычья собака»), а другой с кошками (скажем, «персидский» и «сиамский»), я получу кошек и собак в том же массиве? Или кошки и собаки никогда не будут внутри одного и того же вызова метода одновременно?

Этот метод является 100% streamобезопасным, даже если он не является static . Проблема с безопасностью streamов возникает, когда вам нужно обмениваться данными между streamами – вы должны заботиться об атомарности, видимости и т. Д.

Этот метод работает только с параметрами, которые находятся в стеке и ссылаются на неизменяемые объекты в куче. Стек по своей сути является локальным для streamа , поэтому обмен данными не происходит.

Неизменяемые объекты ( String в этом случае) также являются streamобезопасными, поскольку после их создания они не могут быть изменены, и все streamи видят одинаковое значение. С другой стороны, если метод принимал (изменял) Date вас могла быть проблема. Два streamа могут одновременно модифицировать тот же экземпляр объекта, вызывая условия гонки и проблемы видимости.

Метод может быть только небезопасным, когда он изменяет какое-то общее состояние. Является ли это статичным или нет, не имеет значения.

Функция отлично защищена streamом.

Если вы думаете об этом … предположите, что произойдет, если бы это было иначе. У каждой обычной функции были проблемы с streamами, если они не синхронизированы, поэтому все функции API в JDK должны быть синхронизированы, потому что они потенциально могут быть вызваны несколькими streamами. И поскольку в большинстве случаев приложение использует некоторый API, многопоточные приложения будут фактически невозможны.

Это слишком смешно, чтобы думать об этом, поэтому просто для вас: методы не являются streamобезопасными, если есть ясная причина, почему могут быть проблемы. Старайтесь всегда думать о том, что, если в моей функции было несколько streamов, и что, если бы у вас был отладчик шагов и один шаг за другим продвигался первым … тогда второй stream … может быть, второй раз … были бы проблемы? Если вы найдете его, он не будет безопасным для потолка.

Также помните, что большинство classов Java 1.5 Collection не являются streamобезопасными, за исключением тех, которые указаны, например ConcurrentHashMap.

И если вы действительно хотите погрузиться в это, внимательно изучите ключевое слово volatile и ВСЕ его побочные эффекты. Посмотрите на classы Semaphore () и Lock () и их друзей в java.util.Concurrent. Прочитайте все документы API по classам. Стоит учиться и удовлетворять.

Извините за слишком сложный ответ.

Используйте static ключевое слово с синхронизированными статическими методами для изменения статических данных, разделяемых между streamами. С ключевым словом static все созданные streamи будут бороться за одну версию метода.

Использование ключевого слова volatile вместе с синхронизированными методами экземпляра гарантирует, что каждый stream имеет свою собственную копию общих данных, и чтение / запись не будет протекать между streamами.

Строковые объекты, являющиеся неизменяемыми, являются еще одной причиной вышеописанного streamобезопасного сценария. Вместо этого, если используются изменяемые объекты (скажем, makeMutableArray ..), то наверняка будет предотвращена безопасность streamов.

Interesting Posts
Давайте будем гением компьютера.