方法变量传递更改为null

时间:2018-06-18 06:48:01

标签: java multithreading jvm

我在使用多线程来改进处理的遗留应用程序上工作。我正面临一个不寻常的错误,当我传递一个字符串时,我得到的值作为方法参数传递为null。

 Trace.error("Thread-"+Thread.currentThread().getName()+"-"+Thread.currentThread().getId()+ ": TransactionAudit-request.validateRequest: "+mContext.get("request.validateRequest"));
    rta.setValidateRequest((String) mContext.get("request.validateRequest"));

public void setValidateOnly(String mValidateRequest) {
    Trace.getTracer().error("Thread-"+Thread.currentThread().getName()+"-"+Thread.currentThread().getId()+": Transactionaudit-request.validateRequest: "+mValidateRequest);
    this.mValidateRequest = mValidateRequest;
}

在前两行中,我正在记录并设置对象中的值。 在下一个方法中,记录设置的变量。 然而,这是一些不寻常的事情。

Thread-DocumentValidationTPOOL49-373: TransactionAudit-request.validateRequest: false 
Thread-DocumentValidationTPOOL27-351: CommwithPP.Resent.request.validateRequest: null 

正如您在上面看到的那样,调用setter时的值是false,而当我从setter方法中记录它时,它是null。 我想补充一点,这是一个处理大量请求的应用程序,通常每分钟有数百个事务。这可能是与java中线程执行相关的内存有关。

2 个答案:

答案 0 :(得分:0)

如果多个线程之间没有共享线程安全的对象,则不能保证在一个线程中执行的更新将被其他线程看到。在您的情况下,一个线程设置了false,而其他线程仍然看到了null,它是在对象初始化期间设置的。您应该在线程之间正确共享对象。考虑使用volatile修饰符。

答案 1 :(得分:0)

问题是哈希映射的重新哈希处理,该哈希映射是在插入新元素时执行的,在此特定时刻,如果任何线程请求该值,则该映射可能会返回null。事实证明这是一个很好的用例,强调了在多线程环境中使用线程安全集合的必要性。