Безопасны ли массивы Java в потоке статического метода? - PullRequest
8 голосов
/ 05 ноября 2011
   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, верно?Это проблема?Массив только что читается, никак не изменяется, поэтому я предполагаю, что этот метод является поточно-ориентированным.Но я хочу убедиться, что понимаю почему.

Спасибо!

Ответы [ 3 ]

7 голосов
/ 05 ноября 2011

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

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

1 голос
/ 05 ноября 2011

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

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

0 голосов
/ 05 ноября 2011

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

...