gpt4 book ai didi

java - 声纳违规 : Dodgy - Write to static field from instance method

转载 作者:行者123 更新时间:2023-11-29 03:05:23 26 4
gpt4 key购买 nike

我有一个变量——“protected static Context jndi;”在我的类(class)中,“上下文”是一个接口(interface)。当我尝试以下面提到的方法访问它时,它会生成标题中提到的声纳违规

public JMSQueueResource createQueueResource(String queueBindingName, String qcfBindingName, boolean messagePersisted, boolean autoAcknowledge, boolean nonJMS) throws JMSException, NamingException {
JMSQueueResource qResource = new JMSQueueResource();

try {
jndi = createInitialContext();
if (queueConnectionFactory == null) {
queueConnectionFactory = (QueueConnectionFactory) lookup(jndi, qcfBindingName);
}
qResource.theQueueConnection = queueConnectionFactory.createQueueConnection();

if (autoAcknowledge) {
qResource.theQueueSession = qResource.theQueueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
}
else {
qResource.theQueueSession = qResource.theQueueConnection.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE);
}
Queue queue = (Queue) lookup(jndi, queueBindingName);

//if (nonJMS && queue instanceof com.ibm.mq.jms.MQQueue) {
// com.ibm.mq.jms.MQQueue q = (com.ibm.mq.jms.MQQueue) queue;
// q.setTargetClient(JMSC.MQJMS_CLIENT_NONJMS_MQ);
//}

qResource.theQueueSender = qResource.theQueueSession.createSender(queue);
if (messagePersisted) {
qResource.theQueueSender.setDeliveryMode(DeliveryMode.PERSISTENT);
}
else {
qResource.theQueueSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
}
qResource.theQueueConnection.start();
}
catch (JMSException jmse) {
throw jmse;
}
catch (NamingException ne) {
throw ne;
}
finally {
if(jndi != null){
jndi.close();
}
}

return qResource;
}

我可以看到有人建议使用 Atomic Integer 包装器。这个问题的最佳解决方法是什么?

最佳答案

声纳违规是有效的,因为从实例方法改变静态变量会导致一些非常困惑的行为,例如:

  • 如何确保字段在静态读取访问之前由实例方法初始化?
  • 当多个线程直接或通过 createQueueResource 方法访问该字段时会发生什么情况?

关于 Java documentation ,使它成为静态的并可能被多个线程访问是一个坏主意:

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.

按照建议使用局部变量似乎是避免警告和相关问题的第一种合理方法。

上下文的构建是否昂贵还取决于用于提供它的工厂。

首先你需要担心程序的正确性,然后当你可以测试真正的瓶颈在哪里时,你就可以优化。

编辑:此链接应该提供对 Spring 应用程序上下文的更多见解,以及如何利用 Spring 容器的依赖注入(inject)来使用上下文而不是将其存储在类中的变量中 https://spring.io/understanding/application-context

关于java - 声纳违规 : Dodgy - Write to static field from instance method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32476889/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com