2016-01-31 19 views
5

Quando si utilizza il driver Java async MongoDB: Il seguente callback deve utilizzare un contatore AtomicInteger o un normale int eseguirà il lavoro?MongoCollection.forEach deve essere thread-safe?

Block<Document> theBlock = new Block<Document>() { 
    AtomicInteger counter = new AtomicInteger(); 
    @Override 
    public void apply(final Document document) { 
    counter.incrementAndGet(); 
    } 
}; 
SingleResultCallback<Void> callbackWhenFinished = ... 

collection.find().forEach(theBlock, callbackWhenFinished); 

risposta

2

L'unica differenza tra la MongoDB Java API e la sua controparte async è che i metodi di quest'ultimo sono non-bloccante e diano callback come argomenti. Ciò significa che ciò che ricevi nel callback equivale a ciò che il metodo restituisce nell'API non asincrono.

Qui, si utilizza il metodo find. Restituisce un "normale" iterabile, quindi chiamare forEach su di esso non comporterà più thread.

In altre parole, non hai bisogno di un AtomicInteger: il metodo apply viene chiamato in sequenza, con lo stesso filo.


Se avete ancora dubbi o bisogno di una "prova", è possibile effettuare una delle seguenti operazioni:

  1. aggiungere un System.out.println(Thread.currentThread().getName()); all'interno del blocco. Vedrai che viene sempre eseguito dallo stesso thread;
  2. aggiungere un punto di interruzione all'interno del blocco, configurato per arrestare solo il thread. Ancora una volta, il punto di interruzione bloccherà l'intero codice.