Raceconditie tijdens serialisatie

Mijn applicatie heeft een master en veel slaves die reageren op de call-over-sockets van de master en de statistieken doorsturen in een object. Op dit moment test ik de code met één master en twee slaves. Code werkt prima met 1 slaaf maar met 2 slaven worden de objecten die aan het einde van de meester worden ontvangen tweemaal gevuld, d.w.z. Twee exemplaren van hetzelfde object.

Maser's code: de master ontvangt periodiek van slaven en vandaar ook met behulp van een timer:

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();
        }
 }

en de code van de slaaf:

 {
 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();
            }
      }

Twijfel: 1. Moet ik de objecten van de twee slaven in een array opslaan? Zo ja, hoe kan ik onderscheid maken tussen het twee ontvangen object via de socket, zodat hetzelfde object niet twee keer wordt opgeslagen? Ervan uitgaande dat het verzonden object een uniek kenmerk heeft, zoals id. d.w.z

class PM{
int uniqueid;
}
  1. Ik probeer de volledige code te schrijven en dus geen Jini of andere API's te gebruiken. Bedankt!
2
Het object pm van klasse PM wordt aan de kant van de slaaf verzonden. Ik bewaar ze aan de kant van de meester met behulp van een reeks PM-objecten. Heb ik je vraag beantwoord?
toegevoegd de auteur P R, de bron
Welke objecten worden verzonden? Hoe bewaar je ze?
toegevoegd de auteur Kane, de bron

1 antwoord

Wanneer je ontvangt

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

Sla het niet alleen op in een veld, aangezien het volgende object van de tweede slave ook in die velden wordt geplaatst.

Gebruik in plaats daarvan een lokale variabele, lees de inhoud van het object en handel ernaar. Of als u een andere thread wilt verwerken, voegt u een taak toe aan een ExecutorService met één thread om de objecten te verwerken.

3
toegevoegd
@ PeterLawrey- Bedankt! Ik probeerde het een keer uit. Maar ik run het hoofdprogramma als een getimede taak voor elke 2 seconden. En het object van de kant van de klant bevat niet altijd dezelfde inhoud.
toegevoegd de auteur P R, de bron