Użycie kolekcji thread-safe

0

Zaczynam przygodę z programowaniem wielowątkowym, do tego czasu miałem bardzo mało do czynienia z tym. Proszę o wyrozumiałość :D

Pierwsze pytanie jakie mam to jeżeli używam jakiejś kolekcji thread-safe np. ConcurrentLinkedQueue i mam sytuację taką, że jest pusta to na wywołuję kolejka.wait(). No i czekamy. W momencie gdy coś jest wrzucane do kolejki chcę powiadomić inne wątki więc wołam kolejka.notifyAll() no ale nie mogę tego wywołać gdy nie jestem w bloku synchronized. Czy to poprawne, żeby otwierać blok synchronized tylko po to, żeby wywołać notifyAll? Bo coś mi się nie wydaje... Jak to zrobić poprawnie? Bo rozumiałbym to tak, że jeżeli używam kolekcji thread-safe to nie muszę się już zbytnio zajmować synchronizacją tej kolejki bo synchronizacja powinna być robiona gdzieś "pod spodem".

0

Bo rozumiałbym to tak, że jeżeli używam kolekcji thread-safe to nie muszę się już zbytnio zajmować synchronizacją tej kolejki bo synchronizacja powinna być robiona gdzieś "pod spodem".

Tak, masz rację. To co robisz nie jest potrzebne.

0
Jaca777 napisał(a):

Bo rozumiałbym to tak, że jeżeli używam kolekcji thread-safe to nie muszę się już zbytnio zajmować synchronizacją tej kolejki bo synchronizacja powinna być robiona gdzieś "pod spodem".

Tak, masz rację. To co robisz nie jest potrzebne.

No OK ale jak mam poinformować wątki które czekają gdy kolejka jest pusta, że coś się zmieniło? Bo jak nie robię notifyAll tylko samo wywołanie add do kolejki to po prostu nie startują...

0

Do takiego użycia są raczej przeznaczone implementacje BlockingQueue.

0
zz napisał(a):

Do takiego użycia są raczej przeznaczone implementacje BlockingQueue.

Faktycznie zgodnie z dokumentacją to by się zgadzało ale nadal mam problem z tym wybudzaniem wątków...

0

Ale po co wybudzać? W dokumentacji https://docs.oracle.com/javas[...]concurrent/BlockingQueue.html masz tabelkę z blokującymi metodami. Budzenie wątków jest zaimplementowane w samej kolejce.

0

Ale zrobiłem coś takiego, że osobny wątek sobie zagląda do tej kolejki i jeśli tam coś jest to przetwarza a jeśli nie to powinien czekać a nie zużywać procesora. I teraz tak, jeśli nie mam synchronized to nie mogę mu dać wait jeśli wstawie blok synchronized, uśpię go to znowu nie mam go jak obudzić... i nie bardzo wiem jak to teraz zrobić dobrze.

0

Ale po co te wait i synchronized? Wywołanie take blokuje.

0

Najpewniej czegoś tu jeszcze nie rozumiem :( jak wyżej chodzi mi o to, że inny wątek dodaje do kolejki a inny przetwarza jej elementy wiec jak jest pusta to niech śpi a jak się to zmieni to muszę go jakoś poinformować o tym...

0

Kolejka sama to robi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0