1

Javaを初めて使用する場合、同期に関する質問があります。

私はネットワークに書き込むための次のコードを持っています(今のところ簡単な実装):

public void networkSendData(byte[] data){

    try {

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

    } catch (IOException e) {


    }
}

データ全体を一度に書き込んでいるので、ここで同期化されたブロックレベルが必要かどうか疑問に思いました。または競合状態の可能性はありますか?書き込むデータは複数のソースから来ているので、私は尋ねます。

ありがとうございました。

4

1 に答える 1

1

あなたの例では、複数のスレッドが同じ変数synchronizeにアクセスする場合を除いて、dブロックを持つ必要はありません。out

つまり、複数のスレッドをすべてnetworkSendData同時に呼び出す場合はsynchronize、メソッドを使用する必要があります。flush別のスレッドがメソッドの実行の途中にあるときに、1つのスレッドを呼び出さないようにする必要がありますwrite

public synchronized void networkSendData(byte[] data)

outまた、別のスレッドがメソッドに含まれている可能性がある間は、変数の値にアクセス/変更しているスレッドがないことを確認する必要がありますnetworkSendData

これは、書き込まれたデータを受信して​​いるサーバーがそれをどのように処理するかによって異なります。サーバーに書き込まれる内容に基づいて共有可変変数を更新するために複数のスレッドが使用される場合は、スレッドセーフを実装する必要があります。

于 2010-05-14T12:53:33.630 に答える