我在使用多线程来改进处理的遗留应用程序上工作。我正面临一个不寻常的错误,当我传递一个字符串时,我得到的值作为方法参数传递为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中线程执行相关的内存有关。
答案 0 :(得分:0)
如果多个线程之间没有共享线程安全的对象,则不能保证在一个线程中执行的更新将被其他线程看到。在您的情况下,一个线程设置了false
,而其他线程仍然看到了null
,它是在对象初始化期间设置的。您应该在线程之间正确共享对象。考虑使用volatile
修饰符。
答案 1 :(得分:0)
问题是哈希映射的重新哈希处理,该哈希映射是在插入新元素时执行的,在此特定时刻,如果任何线程请求该值,则该映射可能会返回null。事实证明这是一个很好的用例,强调了在多线程环境中使用线程安全集合的必要性。