deadlock. synchronizacja

0

Witam mam następujący problem.
Mam jednego producenta który pobiera dane z pliku o czasach równych rozkładowi normalnemu m=0.1 s=0.01 i umieszcza daną na kolejce.
Dwóch producentów czyta z kolejki - pierwszy o czasach m=0.15 s=0.2 oraz drugi o czasach m=1.2 s=0.3.
Zrobiłem do tego synchronizacje. Program 10 razy działa a za którymś razem się nie kończy dochodzi do deadlocka.
Doszedłem do tego, że dzieje się tak dlatego że w metodzie run producenta :

void run{
while(reader.hasNext()){
//wywolanie funkcji dodania do kolejki ktora jest zsynchronizowana w sposób taki że jeżeli kolejka jest pełna (koncepcja rozmiaru kolejki jako parametr programu) to wait()
}

ustawienie flagi na 0 - producent zakonczyl prace

}

i właśnie wątek czytający wdziera mi się pomiędzy koniec while a początek ustawiania flagi co skutkuje ciągłym wait() w funkcji synchronizującej konsumentów.
Mam pytanie jak z tego wybrnąć?

Bo już zatarłem sobie zęby i nie mam pomysłów.

0

Możesz rozwinąć kwestie czasu czytania z kolejki? Ja na twoim miejscu napisałbym sobie junita dla testu na funkcje, sprawdził jak działa, dodał parametr synchronized do funkcji i sprawdził jeszcze raz, trudno ocenić co nie działa jak dałeś 4 linijki kodu. Taka sytuacja zachodzi jak jedna zmienna jest modyfikowana przez kilka wątków jednocześnie.

0

Już sobie poradziłem.

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