Являются ли массивы Java в потоке статического метода безопасными?

   public static int rank(int key, int[] a) {
        int lo = 0;
        int hi = a.length - 1;
        while (lo <= hi) {
            // Key is in a[lo..hi] or not present.
            int mid = lo + (hi - lo) / 2;
            if      (key < a[mid]) hi = mid - 1;
            else if (key > a[mid]) lo = mid + 1;
            else return mid;
        }
        return -1;
    }

Вышеуказанный статический метод выполняет двоичный поиск. Это потокобезопасность? Я знаю, что локальные переменные являются потокобезопасными, но "a" здесь представляет собой массив, поэтому это означает, что он является объектом в Java, правильно? Это проблема? Массив просто читается, а не модифицируется каким-либо образом, поэтому я предполагаю, что этот метод является потокобезопасным. Но я хочу убедиться, что понимаю, почему.

Спасибо!

Ответ 1

Никакие массивы обычно не являются потокобезопасными. Является ли ваш код в этом случае, зависит от того, имеют ли другие потоки доступ к массиву, который вы передали. Поскольку массивы передаются по ссылке, тогда другие потоки могут иметь к ним доступ.

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

Ответ 2

Сам метод является потокобезопасным, поскольку он принимает только свои аргументы и читает их, не публикуя их ни в какой другой поток. Но это не значит, что у вас не было проблемы с потоками. Все зависит от того, откуда взялись аргументы.

Если аргументы представляют собой разделяемое состояние между потоками, каждый доступ к этому состоянию должен каким-то образом синхронизироваться. Но вы должны установить политику синхронизации между потоками для защиты доступа к этому состоянию. Таким образом, этот метод или вызывающий объект этого метода должен убедиться, что доступ к состоянию является потокобезопасным. Не зная, откуда возникают аргументы, невозможно определить, является ли этот код потокобезопасным или нет.

Ответ 3

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