[java] Gdzie zdefiniować metodę która jest synchronized?

Odpowiedz Nowy wątek
2006-12-10 22:12
0

Schematycznie mam takie coś:
class Osoba{
imie
nazwisko
i metody
public String getImie{
return imie
}
i taka sama metoda zwracająca nazwisko
}

public class Glowna{
gdzie stworzyłem ArrayList która przechowuje obiekty typu Osoba

tworze również nowy wątek i wywołuje start()
}

class MyThread implements Runnable{
mam tu listę wewnętrzną przekazaną jako parametr, oczywiście to ta lista z Osobami.

mam też
public void run(){
robie tu różne rzeczy, między innymi zasypiam na jakiś czas
i tu muszę wywołać funkcję która jest synchronized !!!!!!/////////////
Właśnie tu jest problem, gdzie zdefiniować tą zsynchronizowaną metodę?????
Ta metoda musi czytać z tej naszej listy obiektów typu osób.
}

}

Pozostało 580 znaków

2006-12-10 22:22
nicka
0

jeżeli wątek ma kopie tej listy u siebie to nie ma sensu synchronizować dostępu do niej...
synchronizujesz operacje na tych obiektach do których ma dostęp więcej wątków.
funkcje którą chcesz użyć umieść w tej klasie do której elementów ona się odnosi.

to słówko synchronized daje Ci to że żaden inny wątek nie przerwie wykonywania instrukcji zawartych danej funkcji czy bloku.

Najpierw zastanów sie gdzie ma być jaka funkcja, a potem które instrukcje,które funkcje powinny być zsnychronizowane ;)

Pozostało 580 znaków

2006-12-11 18:50
0
nicka napisał(a)

jeżeli wątek ma kopie tej listy u siebie

a widzisz zeby tam gdzies robil clone()? po za tym jaki jest cel robienia kopii, skoro dane powinny byc raczej spojne!

synchronizacje watkow stosujesz w momencie, w ktorym wiele watkow czyta i MODYFIKUJE (bo bez tego to nie ma sensu) pewne zmienne dzielone.
i teraz zalezy co chcesz zrobic
jesli np. chcesz, aby watki zmienialy i pobieraly imie albo wogole jakies dane osoby - najlepiej zastosowac obiekty klasy ReentrantLock lub ReentrantReadWriteLock i z niego popbrac obiekty ReadLock i WriteLock a nastepnie w zaleznosci od dokonywanej oberacji blokowac obiekt klasy osoba metodami lock() i unlock()
natomiast jasli np. zmieniasz zawartosc listy to w metodach dodajDoListy i pobierzZListy zrob blok synchronizowany na obiekcie lista.
metoda synchronizowana przydaje sie tylko wtedy kiedy chcesz na szybko sprawic aby tylko jeden watek z niej korzystal (np. gdybys tylko wstawial do listy, poniewaz zauwaz, ze gdybys chcial cos z niej pobrac to co z tego, ze jeden watek na raz ja modyfikuje, jesli inny w tym samym czasie sprawdzi ze moze pobrac ostatni element i zostanie wywlaszzony a nastepnie siegnie do nieistniejacego juz indexu?)

pozdrawiam

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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