序列化期间的竞争条件

时间:2011-11-11 18:03:21

标签: java serialization

我的应用程序有一个主服务器和许多从服务器,它们响应主服务器的调用套接字并在对象中发送统计信息。现在,我正在用一个主服务器和两个从服务器测试代码。代码适用于1个从站,但有2个从站,在主站端接收的对象将填充两次,即同一对象的两个副本。

Maser的代码:主设备定期从从设备接收,因此使用计时器排除:

public void run() {

    try {
        byte[] recvBuf = new byte[15000];
        DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length);
        DatagramSocket dSock = new DatagramSocket(4445);
        dSock.receive(packet);
        int byteCount = packet.getLength();
        ByteArrayInputStream byteStream = new ByteArrayInputStream(recvBuf);
        ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(byteStream));
         //receiving the object pm of class PM
        pm1=(PM)is.readObject();
        }
 }

和奴隶的代码:

 {
 InetAddress address = InetAddress.getByName("10.129.54.254");
            ByteArrayOutputStream byteStream = new ByteArrayOutputStream(15000);
            os = new ObjectOutputStream(new BufferedOutputStream(byteStream));
            os.flush();
            //sending the object pm of class PM
            os.writeObject((PM)pm);
            os.flush();
            byte[] sendBuf = byteStream.toByteArray();
            DatagramPacket packet = new DatagramPacket(sendBuf, sendBuf.length, address, 4445);
            int byteCount = packet.getLength();
            DatagramSocket dSock = new DatagramSocket();
            dSock.send(packet);
            os.close();
            dSock.close();
            }
      }

的疑问: 1.我应该将两个从属对象存储在一个数组中吗?如果是这样,我如何区分套接字上的两个接收对象,以便相同的对象不存储两次?假设发送的对象具有唯一的属性,例如id。 即

class PM{
int uniqueid;
}
  1. 我正在尝试编写整个代码,因此不想使用Jini或其他API。 谢谢!

1 个答案:

答案 0 :(得分:3)

收到

     //receiving the object pm of class PM
    pm1=(PM)is.readObject();

不要只将它存储在一个字段中,因为第二个从属的下一个对象也将被放置在那些字段中。

相反,您应该使用局部变量,读取对象的内容并对其进行操作。或者,如果您希望另一个线程处理它,请将任务添加到单个线程ExecutorService以处理对象。