gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:08:09 24 4
gpt4 key购买 nike

我的应用程序有一个主站和许多从站,它们响应主站的调用套接字并在对象中发送统计信息。现在,我正在用一个主机和两个从机测试代码。代码在 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。
IE
class PM{
int uniqueid;
}
  • 我正在尝试编写整个代码,因此不想使用 Jini 或其他 API。
    谢谢!
  • 最佳答案

    当您收到

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

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

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

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

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com