2016-01-31 25 views
5

Podczas korzystania ze sterownika Java Async Async: Czy następujące wywołania zwrotne muszą używać licznika AtomicInteger lub czy normalne int wykona zadanie?Czy MongoCollection.forEach musi być bezpieczny dla wątków?

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); 

Odpowiedz

2

Jedyną różnicą pomiędzy MongoDB Java API i jego async odpowiednikiem jest to, że metody te ostatnie bez blokowania się i zwrotnych jako argumenty. Oznacza to, że to, co otrzymasz w swoim oddzwanianiu, jest równoważne z tym, co zwraca metoda w nieza asynchronicznym interfejsie API.

Tutaj używasz metody find. Zwraca "normalną" iterowalność, więc wywołanie na niej nie spowoduje wielu wątków.

Innymi słowy, nie potrzebują AtomicInteger: metoda apply nazywa się kolejno, w tym samym wątku.


Jeśli nadal masz wątpliwości lub potrzebujesz „dowód”, można wykonać jedną z następujących czynności:

  1. dodać System.out.println(Thread.currentThread().getName()); wewnątrz bloku. Zobaczysz, że zawsze jest wykonywany przez ten sam wątek;
  2. dodaj punkt przerwania do swojego bloku, skonfigurowany tak, aby zatrzymywał tylko wątek. Ponownie punkt przerwania zablokuje cały kod.
Powiązane problemy