2013-01-09 6 views
19

Muszę napisać fasolę, która będzie działała jako licznik tego, ile razy była dostępna.JEE6 @ApplicationScoped bean i współbieżność

mam na myśli używając @ApplicationScoped Bean z AtomicInteger jak ten

@ApplicationScoped 
class VisitsCounter { 

    private AtomicInteger counter; 

    @PostConstruct 
    public void construct() { 
     counter = new AtomicInteger(0); 
    } 

    public int visited() { 
     return counter.incrementAndGet(); 
    } 
} 

Moje pytanie brzmi: Czy to jest ok, rozważając wiele żądań w tym samym czasie? Czy muszę grać z adnotacjami @ConcurrencyManagement i @Lock? Przypuszczam, że Atomic* powinien załatwić sprawę, ale nie jestem pewien.

Czy to samo dotyczy sytuacji, gdy mam kolekcje z wątkami jako pola? Na przykład. mówi, że mam operacje naprawdę wątkowe bezpieczne?

Mówi się, że adnotacje i blokady współbieżne powinny być używane w przypadku modyfikacji stanu fasoli, ale co, jeśli moja lista już zajmuje się bezpieczeństwem wątków?

+2

Zaimplementowane, nie widzę żadnych problemów z współbieżnością. – McDowell

Odpowiedz

31

W CDI nie masz zarządzania współbieżnością, więc @ApplicationScoped po prostu określa moc iniekowanego obiektu (tj. Instruuje silnik wtrysku, aby utworzyć tylko jedną instancję komponentu bean i używał go we wszystkich aplikacjach). Nie przekształca on komponentu bean w EJB i nie wymusza żadnego ograniczenia współbieżności.

Tak więc, podczas gdy operacje w przykładach są z natury bezpieczne dla wątków, dzięki AtomicInteger i liście zsynchronizowanej to samo nie jest prawdą w ogóle.

W ogóle można:

  • ręcznie zsynchronizować listę dostęp za pośrednictwem standardowych prymitywów współbieżności (jak to zrobić)

  • lub użyj javax.ejb.Singleton adnotacji, która nakazuje serwera aplikacji zarządzać współbieżnością. Przekształca to komponent bean w komponencie EJB i domyślnie wymusza @ConcurrencyManagement(ConcurrencyManagementType.CONTAINER) i .

Nawiasem mówiąc, @ConcurrencyManagement i @Lock są dostępne tylko na pojedynczych ziaren sesyjnych.

+0

Dobry. Zastanawiam się, co by się stało, gdybym wstrzyknął fasolę '@ ApplicationScoped' do' @ Stateful' EJB, wygląda na to, że możesz napotkać problemy, ponieważ od 2 instancji EJB możesz modyfikować te same dane. – dalvarezmartinez1