Два потока, вызывающие статическую функцию - проблемы с синхронизацией? - PullRequest
0 голосов
/ 14 декабря 2011

(я использую Java!) У меня есть два потока t1 и t2.Каждый поток читает из входного потока Socket, вызывая функцию public static следующим образом:

public static byte[] readSocket(DataInputStream dis, Logger log) throws IOException
    {
        byte[] byteArray = new byte[100]; 
        if(dis.read(byteArray, 0, 100)!=-1)
        {
            return byteArray;
        }
    }

Будет ли проблема синхронизации, если

  1. inputsreamиз разных сокетов (т.е. t1 читает из другого сокета и t2 из другого).
  2. входной поток одинаков для обоих потоков t1 и t2.

Ответы [ 4 ]

2 голосов
/ 14 декабря 2011

Это не приведет к гонке данных. Если вы вызываете один и тот же метод в разных потоках, каждый поток имеет свою копию в своем стеке. Поэтому локальные переменные внутри метода существуют в стеке каждого потока с разными копиями.

Итак, ваша единственная проблема может появиться, если DataInputStream, который является внешним параметром, является общим или нет. Если нет, то у вас нет проблем. Тот факт, что метод является статическим, никак не влияет на то, что я сказал выше.

2 голосов
/ 14 декабря 2011

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

Документация DataInputStream гласит:

DataInputStream не обязательно безопасен для многопоточного доступа

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

1 голос
/ 14 декабря 2011
  1. Нет, если потоки из разных сокетов, то это потокобезопасно.
  2. Да.Цитата из javadoc

DataInputStream не обязательно безопасен для многопоточного доступа.Безопасность потоков является необязательной и является обязанностью пользователей методов этого класса.

0 голосов
/ 14 декабря 2011
  1. Нет, пока метод не имеет общих полей области действия выше (где экземпляр byteArray создан?)
  2. Да
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...