2010-08-13 115 views
2

我聲明一個Spring bean對於被用作工廠來創建對象的Java類。我想從不同的線程使用這個工廠,我遇到的問題是線程在嘗試使用工廠創建對象時被阻塞。的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; 
} 

}

+0

我發現這個線程:http://forum.springsource.org/showthread.php?t=46101它似乎是由bean引用的Java類的方法是不同步的,除非你寫他們的同步。 – yeforriak 2010-08-13 15:14:14

+1

當然不是。 Spring仍然是Java;它不會讀你的想法。單身人士必須以線程安全的方式編寫。 – duffymo 2010-08-13 15:49:02

+0

你需要發佈一些代碼。通常情況下,工廠不應該攜帶很多狀態,所以工廠方法通常不應該阻塞。如果你沒有同步任何東西,任何東西都不應該阻塞(雖然狀態可能會混亂)。你在做什麼你的createObject方法? – 2010-08-14 21:23:17

回答

1

由於寫的,它不會出現有這一類需要是線程安全的事情。每次調用createObjects時,都會創建一個新的ConfigurableObjects列表。爲了添加一個SomeObject bean,然後返回它。

一個問題:是SomeObject實例應該是一個單身本身?如果是這樣,那麼你需要保存它,只有調用getBean,如果它是null。

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的訪問。

+0

我不想讓createObjects()方法同步,因爲我想同時從不同的線程調用它。我正在使用一個分析器,並且線程調用createObjects(beanFactory的行)似乎有一些阻塞。 回答你的問題,SomeObject是一個原型。 – yeforriak 2010-08-24 15:59:32