gpt4 book ai didi

java - Spring bean线程安全

转载 作者:行者123 更新时间:2023-11-30 11:57:56 25 4
gpt4 key购买 nike

我正在为用作创建对象的工厂的 Java 类声明一个 Spring bean。我想从不同的线程使用这个工厂,我遇到的问题是线程在尝试使用工厂创建对象时被阻塞。

据我所知,spring bean 默认是单例的,这就是我想要的。我希望工厂是一个单例,但我想从不同的线程使用这个工厂创建对象。工厂中的方法 createObject() 是不同步的,所以我不太明白为什么我有这个同步问题。

关于实现此目标的最佳方法有什么建议吗?

这是工厂的java代码:

public class SomeFactory implements BeanFactoryAware {

private BeanFactory beanFactory;

public List<ConfigurableObjects> createObjects() {
List<ConfigurableObjects> objects = new ArrayList<ConfigurableObjects>();
objects.add((SomeObject)beanFactory.getBean(SomeObject.class.getName()));

return objects;
}

public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}

最佳答案

正如所写的那样,这个类中似乎没有任何东西需要线程安全。每次调用 createObjects 时都会创建一个新的 ConfigurableObjects 列表。向该列表添加一个 SomeObject bean,然后返回它。

一个问题:SomeObject 实例本身应该是一个单例吗?如果是这样,那么您需要保存它并且只在它为 null 时才调用 getBean。

private SomeObject someObjectInstance = null;

public synchronized List<ConfigurableObjects> createObjects() {
List<ConfigurableObjects> objects = new ArrayList<ConfigurableObjects>();
if (someObjectInstance = null)
{
someObjectInstance = (SomeObject)beanFactory.getBean(SomeObject.class.getName());
}

objects.add(someObjectInstance);
return objects;
}

在这种情况下,您需要同步对 CreateObjects 的访问,如我所示。

关于java - Spring bean线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3478079/

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