В этом вопросе Is GenericObjectPool<T> from commons.apache.org thread safe? Упоминается, что его нить безопасна.Является ли GenericObjectPools заимствованным методом Thread Thread?
Отредактировано: но у меня есть ситуация в моем многопоточном приложении, что два потока одновременно получают один и тот же объект из пула. Это утверждение было неправильным.
Я переместил объект loanObject, чтобы синхронизировать блок, и он решил мою проблему.
Неужели кто-нибудь сталкивался с этой проблемой ранее?
Вот мой код:
public static GenericObjectPool<IDocBuilderPool> documentBuilderPool = new GenericObjectPool(new DocumentPool());
static {
documentBuilderPool.setMaxActive(1000);
documentBuilderPool.setMaxWait(30000);
documentBuilderPool.setMaxIdle(-1);
}
//method that returns document pool called by multiple threads .
public static IDocBuilderPool getDocumentPool() {
return documentBuilderPool.borrowObject();
}
//The pool factory class
public class DocumentPool extends BasePoolableObjectFactory<ICollabrrDocument> {
public DomDocumentPool() {
}
@Override
public DomDocument makeObject() throws Exception {
// TODO Auto-generated method stub
return new DomDocument();
}
@Override
public void activateObject(IDocBuilderPool obj) throws Exception {
// TODO Auto-generated method stub
super.activateObject(obj);
}
@Override
public void destroyObject(IDocBuilderPool obj) throws Exception {
// TODO Auto-generated method stub
super.destroyObject(obj);
}
@Override
public void passivateObject(IDocBuilderPool obj) throws Exception {
// TODO Auto-generated method stub
obj.release();
super.passivateObject(obj);
}
@Override
public boolean validateObject(IDocBuilderPool obj) {
// TODO Auto-generated method stub
return super.validateObject(obj);
}
}
public class DomDocument implements IDocBuilderPool {
private Document domDocument;
private DocumentBuilder documentBuilder;
private DocumentBuilderFactory documentBuilderFactory;
public HashMap<org.w3c.dom.Node, DOMElement> elementMap = new HashMap<org.w3c.dom.Node, DOMElement>();
public long threadID;
public DomDocument() {
setDomDocument();
this.threadID = Thread.currentThread().getId();
}
public void setDomDocument() throws
this.documentBuilderFactory = DocumentBuilderFactory.newInstance();
this.documentBuilderFactory.setNamespaceAware(true);
this.documentBuilder = this.documentBuilderFactory.newDocumentBuilder();
this.domDocument = this.documentBuilder.parse(new ByteArrayInputStream("<Root/>".getBytes()));
}
}
Можете ли вы разместить свой тест, чтобы мы могли его воспроизвести? Это может быть ошибка в их коде или вашем тесте. BTW Общие пулы объектов могут быть более дорогими, чем создавать новые объекты каждый раз, когда esp с Java 5.0. Я использую пулы объектов, но обнаруживаю, что, чтобы убедиться, что они быстрее, они должны быть пулом объектов класса, настроенным на конкретные варианты использования. –
Все общедоступные методы класса синхронизированы, поэтому он выглядит нормально (задача назначена конструктором, но вряд ли это будет проблемой). Таким образом, проблема, возможно, в вашем коде ... – assylias
Привет, assylias., Является ли задание запланировано в соответствии с политикой выселения пула genericobject. Любой способ я не включил. Проверьте код выше. –