Блок синхронизированной записи Java

Я новичок в Java, и у меня есть вопрос о Synchronized.

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

public void networkSendData(byte[] data){

    try {

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

    } catch (IOException e) {


    }
}

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

благодарю вас.


person iTEgg    schedule 14.05.2010    source источник


Ответы (1)


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

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

public synchronized void networkSendData(byte[] data)

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

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

person Finbarr    schedule 14.05.2010
comment
на стороне сервера есть только один поток, прослушивающий входящие данные. - person iTEgg; 14.05.2010
comment
спасибо, это то, что мне было интересно. несколько узлов передают одновременно (редко, но может случиться). - person iTEgg; 14.05.2010