Блок синхронной записи Java - PullRequest
1 голос
/ 14 мая 2010

Я новичок в Java, и у меня есть вопрос, касающийся синхронизации.

У меня есть следующий код для записи в сеть (пока простая реализация):

public void networkSendData(byte[] data){

    try {

        out.write(data);
        out.flush();

    } catch (IOException e) {


    }
}

Мне было интересно, есть ли необходимость в синхронизации на уровне блоков, поскольку я пишу все данные одновременно. или есть шанс на гонку? Я спрашиваю, потому что данные для записи поступают из нескольких источников.

спасибо.

1 Ответ

1 голос
/ 14 мая 2010

В вашем примере нет необходимости иметь блок synchronize d, если только несколько потоков не будут иметь доступ к одной и той же переменной out.

Другими словами, если у вас есть несколько потоков, вызывающих networkSendData одновременно, вы должны synchronize метод. Вы не хотите, чтобы один поток вызывал flush, в то время как другой поток находится на полпути выполнения метода write.

public synchronized void networkSendData(byte[] data)

Вам также необходимо убедиться, что никакие потоки не обращаются к / не изменяют значение переменной out, в то время как есть вероятность, что другой поток может быть в методе networkSendData.

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

...