2010-05-14 89 views
1

即时通讯新的Java和我有一个关于Synchronized的问题。Java同步写块

我有下面的代码写入到网络(简单实现现在):

public void networkSendData(byte[] data){ 

    try { 

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

    } catch (IOException e) { 


    } 
} 

我想知道是否有此同步,即时我一次写入整个数据需要块级。还是有机会出现竞赛状况?我问,因为要写的数据来自多个来源。

谢谢。

回答

1

以您为例,除非多个线程将访问相同的out变量,否则不需要有一个synchronize d块。

换句话说,如果你有多个线程同时调用networkSendData,你应该是synchronize的方法。您不希望有一个线程调用flush,而另一个线程执行write方法的一半。

public synchronized void networkSendData(byte[] data) 

您还需要确保没有任何线程访问/修改out变量的值,同时有一个机会,另一个线程可以在networkSendData方法。

这取决于接收写入数据的服务器如何处理它。如果使用多个线程根据写入服务器的内容更新共享可变变量,则需要实现线程安全性。

+0

在服务器端,只有一个线程监听传入数据。 – iTEgg 2010-05-14 12:55:07

+0

我已经更新了我的答案。 – Finbarr 2010-05-14 12:58:49

+0

谢谢,这是我想知道的。多个节点同时传输(很少但可能发生)。 – iTEgg 2010-05-14 12:59:13