JNDI树中的对象是否是线程安全的?
比方说,我做了类似的事情:
伪码:
String value = null;
try {
value = context.lookup("someValue")
} catch (Exception ignored) {}
if (value == null) {
value = "My name is "+currentThread.getName()
context.bind("someValue", value);
}
现在有可能第一个线程检查someValue,发现它为空,然后去为它设置一个值但是此时正好另一个线程进来并检查它并且它也发现值为空所以它设置了它自己的值,所以第一个线程将值绑定到它的名称,然后第二个线程重新绑定到它自己的名称覆盖第一个?
或者有什么方法可以使这个线程安全吗?
答案 0 :(得分:0)
将自定义对象(非RMI对象)绑定到WebLogic Server群集中的JNDI树时,将在群集中的所有服务器之间复制该对象。但是,如果主机服务器出现故障,则会从群集的JNDI树中删除自定义对象。除非再次绑定自定义对象,否则不会复制自定义对象。每次要传播对自定义对象所做的更改时,都需要取消绑定并重新绑定自定义对象。
解除绑定和重新绑定是昂贵(缓慢)的操作。
在此处查看更多信息:http://docs.oracle.com/cd/E13222_01/wls/docs81/jndi/jndi.html#475689
关于线程安全与上下文有大量信息。您将需要查看每个群集完全一次的设计模式。