gpt4 book ai didi

java - 是 javax.naming.InitialContext ThreadSafe

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:52:55 27 4
gpt4 key购买 nike

目前,我正在使用以下代码查找普通 POJO 类的 EJB3 无状态 session bean。 (我们在 JEE5 中,所以我们不能在正常的 POJO 类中注入(inject)无状态 session Bean,我必须使用查找)

import javax.naming.Context;  
import javax.naming.InitialContext;
import javax.naming.NamingException;

import org.apache.log4j.Logger;

public Object getEJB(String jndiName) {

logger.debug("WEBSPHERE EJB Lookup : " + jndiName);
String modifiedJndiName = "";
Hashtable<Object, Object> properties = new Hashtable<Object, Object>();
properties.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
properties.put(Context.PROVIDER_URL, "iiop://localhost:2809");
try {
Context context = new InitialContext(properties);
logger.debug("WEBSPHERE EJB Lookup Modified JNDI Name: " + modifiedJndiName);
return context.lookup("ejblocal:"+modifiedJndiName);
}catch (NamingException ne) {
logger.debug("Naming Exception occurred :"+jndiName +">>>"+ne.getMessage());
logger.error(ne.getMessage(), ne);
}

return null;
}

那么 Context 对象是 ThredSafe 吗?我应该为每次调用创建 Context 对象 [如此代码片段所示] 还是我可以为所有线程重用 Context?

最佳答案

有关线程安全的答案通常已经在 javadoc 中提及,只要相关。事实上,InitialContext javadoc提到以下内容:

An InitialContext instance is not synchronized against concurrent access by multiple threads. Multiple threads each manipulating a different InitialContext instance need not synchronize. Threads that need to access a single InitialContext instance concurrently should synchronize amongst themselves and provide the necessary locking.

最后一句话证实了这一点:它不是线程安全的,每线程同步是必要的。然而,在您的特定代码示例中,不需要同步,因为它无论如何都是在方法本地范围内创建的(即它肯定不会在线程之间共享)。如果 InitialContext 在您的特定代码示例中是一个实例变量,那么您必须将 synchronized 关键字添加到 getEJB()方法。

关于java - 是 javax.naming.InitialContext ThreadSafe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13317848/

27 4 0