阻止java线程共享数据?

阻止java线程共享数据?,java,thread-safety,Java,Thread Safety,我有一个应用程序(服务器端),它位于端口上并侦听客户端连接。 一旦建立了连接,应用程序就会启动处理该连接的解析器(另一个线程) 我的问题是,在某些时候(因为解析可能需要很长时间),服务器应用程序会在处理另一个线程时启动一个新线程。这是一种期望的行为,而不是问题本身。发生的情况是,新线程似乎从旧线程读取了一些状态变量,因此操作错误 粗略地说,解析器所做的是: 客户端总是发送两个数据包;第一个基本上是敲打数据包,第二个是真实数据包。 我读取第一个数据包,如果我决定接受它,我会将它放入一个变量中,以便

我有一个应用程序(服务器端),它位于端口上并侦听客户端连接。 一旦建立了连接,应用程序就会启动处理该连接的解析器(另一个线程)

我的问题是,在某些时候(因为解析可能需要很长时间),服务器应用程序会在处理另一个线程时启动一个新线程。这是一种期望的行为,而不是问题本身。发生的情况是,新线程似乎从旧线程读取了一些状态变量,因此操作错误

粗略地说,解析器所做的是: 客户端总是发送两个数据包;第一个基本上是敲打数据包,第二个是真实数据包。 我读取第一个数据包,如果我决定接受它,我会将它放入一个变量中,以便可以读取下一个数据包

在我描述的场景中,第一个线程读取敲打数据包并验证它。 下一个数据包到达(在同一线程上)并开始解析

同时,创建另一个解析器并等待其第一个数据包; 然后发生的事情(问题)是,它检查验证变量(对于这个线程应该是false)并发现它是ok的(它从上一个线程读取,该线程仍在执行),然后继续解析knock-knock数据包,就好像它是数据包一样

am lokoing的目的是完全消除数据共享。我使用以下类跟踪会话状态:

public class SessionInfo {

    private Constants.PacketValidity validity;
    private int packetSize;
    private String IMEI;
    private int packetReportedSize;
    private Constants.PacketType packetType;
    private int codec;
    private int records;
    private boolean valid;
    private Constants.ResponseType responseType;
    private String clientIP;
    private int serverPort;
    private Date parseInit;
    private Date parseEnd;
}
除此之外,该类还有一组setter和getter

解析器将此对象的实例作为私有字段


如何实现这一点?

您需要确保两个单独的线程使用两个单独的
SessionInfo
实例


实现这一点最简单的方法可能是创建一个新的解析器实例,该实例反过来创建一个新的
SessionInfo
实例。一旦您确定它们有单独的实例,您就可以了。

您需要确保两个单独的线程使用两个单独的
SessionInfo
实例

实现这一点最简单的方法可能是创建一个新的解析器实例,该实例反过来创建一个新的
SessionInfo
实例。一旦您确定它们有单独的实例,您就应该没事了

解析器将此对象的实例作为私有字段

这是你的问题。解决方案是创建一个新的
SessionInfo
,并将其作为方法参数传递给解析器,然后将其传递给进一步的方法调用。执行此操作后,对会话状态的引用将是当前线程执行的本地引用

如果解析器包含更多在解析过程中更新的私有属性,则还需要提取这些属性。将它们组合到一个私有子类中,并在调用您进行解析时创建该类的实例,这将是解决该问题的一个可能的方法

解析器将此对象的实例作为私有字段

这是你的问题。解决方案是创建一个新的
SessionInfo
,并将其作为方法参数传递给解析器,然后将其传递给进一步的方法调用。执行此操作后,对会话状态的引用将是当前线程执行的本地引用


如果解析器包含更多在解析过程中更新的私有属性,则还需要提取这些属性。将它们组合到一个私有子类中,并在调用您进行解析时创建该类的实例,这可能是解决该问题的一种方法。

在创建线程和检查变量时显示您的代码。这两个数据包对是否应在同一个会话上?如果他们在同一个会话中,他们可能应该构建类似于会话的内容,即SessionInfo更像是一个ConversationInfo,并且应该有多个实例。在创建线程和检查变量时展示您的代码。两个数据包对是否应该在同一个会话中?如果他们在同一个会话中,他们可能应该构建类似于会话的内容,即SessionInfo更像是一个ConversationInfo,应该有多个实例。