gpt4 book ai didi

java - ConcurrentLinkedQueue poll() 产生损坏的数据?

转载 作者:行者123 更新时间:2023-11-30 09:16:51 24 4
gpt4 key购买 nike

我目前正在开发一个 Java 项目,该项目在原始数据包通过网络时对其进行处理。数据由libpcap读入,然后每个数据包放入一个byte[],然后放入一个ConcurrentLinkedQueue,线程从中读取和处理数据。

    static ConcurrentLinkedQueue<byte[]> packetQueue = new ConcurrentLinkedQueue<byte[]>();

public void nextPacket(PcapHeader header, ByteBuffer buffer PcapDumper user) {
pcapBufferCapacity = buffer.capacity();

if (pcapBufferCapacity > 54) {
dumper.dump(header, buffer);
}

if (pcapBufferCapacity > 43) {
byte[] packetBytes = new byte[buffer.remaining()];
buffer.get(packetBytes);
packetQueue.add(packetBytes); // Data being added to the queue
}
}

然后我有一个正在运行的线程...

Thread thread = new Thread(new Parser()); // Parser extends Runnable

...poll() 是工作队列,然后处理数据。

int parserByteCount;
byte[] packetBytes;

public void run() {
packetBytes = MyClass.packetQueue.poll();
parserByteCount = packetBytes.length;
doStuff();
}

当我运行一个 Parser() 线程时,一切都按预期工作。但是,如果我运行多个解析器线程...

Thread thread2 = new Thread(new Parser());

...来自 MyClass.packetQueue.poll() 的数据损坏,从静态 PCAP 文件读取时我的结果不一致。考虑到它与一个 Parser() 线程一起完美工作,但在多个 Parser() 线程运行时变得损坏,我认为这与并发性有关。但是,由于数据是从 ConcurrentLinkedQueue 中放置/轮询的,它不应该在线程之间正常工作吗?我错过了什么?

感谢您提供的任何见解。

最佳答案

int parserByteCount;
byte[] packetBytes;

这些是您的Parser 类的成员变量吗?在 doStuff() 中正确解析是否需要它们?

如果您两次回答,您可能有麻烦了。请记住,线程共享内存。因此,对可能同时访问的所有实例或类级变量的访问必须是同步的。请注意,局部变量不是共享的——它们存在于堆栈中,这对于每个线程都是唯一的。一个简单的解决方法是将两个关键变量更改为局部变量,必要时将它们作为方法参数传递。

关于java - ConcurrentLinkedQueue poll() 产生损坏的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19257004/

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