java - 序列化期间的竞争条件

标签 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。 谢谢!

最佳答案

当您收到

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

不要只是将其存储在字段中,因为来自第二个从属的下一个对象也将放置在该字段中。

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

关于java - 序列化期间的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8098072/

相关文章:

基于 C++ STL 的二进制序列化数据发送,使用套接字进行网络传输,无需使用库

java - 不满意链接错误 : no jcprov in java. library.path

java - 找不到 docker 文件

c++ - 在 C 中将结构序列化/反序列化为 char*

c# - 如何通过 Protobuf/Protobuf-net 使用某些对象继承的列表/数组?

java - 在GSON中,有没有办法将内部类中的字段反序列化到父类中?

c++ - 包括多个动态数组的 c-struct 的分配

java - Eclipse:导航到先前访问的文件

java - 将数据插入jtable

java - 为什么我的 ArrayList 是空的,即使 firebase datasnapshot 包含子项