2013-08-08 2 views
2

В этом вопросе 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())); 


} 

}

+0

Можете ли вы разместить свой тест, чтобы мы могли его воспроизвести? Это может быть ошибка в их коде или вашем тесте. BTW Общие пулы объектов могут быть более дорогими, чем создавать новые объекты каждый раз, когда esp с Java 5.0. Я использую пулы объектов, но обнаруживаю, что, чтобы убедиться, что они быстрее, они должны быть пулом объектов класса, настроенным на конкретные варианты использования. –

+0

Все общедоступные методы класса синхронизированы, поэтому он выглядит нормально (задача назначена конструктором, но вряд ли это будет проблемой). Таким образом, проблема, возможно, в вашем коде ... – assylias

+0

Привет, assylias., Является ли задание запланировано в соответствии с политикой выселения пула genericobject. Любой способ я не включил. Проверьте код выше. –

ответ

2

В documentation of PoolableObjectFactory состояния:

PoolableObjectFactory должен быть потокобезопасным.

Глядя на ваш код, единственное, что может быть небезопасным, это вызов obj.release();. Возможно, это проблема.

Помимо этого все выглядит нормально ...

+0

obj.release() - это вызов экземпляра, который работает только на этом конкретном объекте. –

+1

@BijuCNair На самом деле я дал вам некоторую BS - не уверен, какой код я искал, но [эта реализация v1.6 GenericObjectPool] (http://commons.apache.org/proper/commons-pool/api-1.6/ src-html/org/apache/commons/pool/impl/GenericObjectPool.html # строка.192) есть ** не ** все синхронизировано. В частности, метод 'loanObject' (строка 1058), который возвращает новые объекты, использует сложную синхронизацию, и на первый взгляд трудно сказать, правильно ли это. Там может быть ошибка (я не знаю). – assylias

Смежные вопросы