jak synchronizować metodę

jak synchronizować metodę
0

Z tego co zrozumiałem, to stosując synchronizacje w poniższym kodzie powinienem otrzymać:
10101010101...
a otrzymuję:
1232323232323210
Czyli wychodzi na to że wątek wtrąca się w połowie synchronizowanej metody innego wątka, a nie powinien.
Chyba, że coś źle napisałem

Kopiuj
public class Test extends Thread {
	
	static int i=0;
	
	Test(){
		start();
	}
	
	synchronized void dodajOdejmij(){
		for(int j=0;j<3;j++){
			i++;
			System.out.print(i);
			try {
				sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			i--;
			System.out.print(i);
		}
	}
	
	public void run(){
		dodajOdejmij();
	}
	
 public static void main(String args[]) {
	 
	 new Test();
	 new Test();
	 new Test();
}
}

Celem jest otrzymanie kodu 01010101... za pomocą synchronized

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:11 minut
0

synchronized w tym przykładzie nie pełni żadnej funkcji ochronnej dla 'i', poczytaj jak działa to słowo kluczowe, a zrozumiesz, że to co zrobiłeś jest zupełnie bezsensu.

tak to raczej powinno wyglądać


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
wedlock
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Bartoszyce
  • Postów:180
0

a nie powinieneś synchronizować wątków między sobą ? Bo jak na razie to puszczasz je po kolei i tak są uruchamiane.

MarekR22
on próbował zrobić synchronizację wątków, ale na razie nie rozumie jak działa słowo kluczowe synchronized
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Ja myśle że autor nie rozumie o co wam chodzi ;)
Otóż synchronizacja metody działa na OBIEKCIE a nie na klasie. A ty masz tam 3 obiekty których metody synchronizujesz, w efekcie ta synchronizacja nijak nic ci nie daje. Co powinieneś był zrobić? Zrobić obiekt który przechowuje pewną wartość licznika (np. klasa Licznik) i wszystkie 3 wątki dostają referencje do tego samego obiektu i próbują modyfikować jego wartość (Licznik ma mieć synchronizowane metody do dekrementacji i do inkrementacji)


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
SH
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 4 lata
0

Ja się wątków nie dotykam, jeśli naprawdę nie muszę i staram się je omijać (wątki AWT itd. są ok, ale nie te tworzone przeze mnie). Normalne że człowiek się machnie i potem szuka błędu jeśli się program kompiluje. Jednak znajdywanie błędów jeśli powodują go wątki, to trudna sprawa. A jak już się używa to trzeba to mieć bardzo dobrze opanowane i uważać.


C++ to wyjątkowy język - wysokopoziomowy z niskopoziomowymi mechanizmami, którymi można rozwalić w drobny mak te wysokopoziomowe.
wedlock
A ja mam parcie na wątki, bo wrzucam jakąś pracę do niego i nie interesuję się nim i robię swoje w mainie. Po skończonej pracy dostaję gotowy wynik. Tak robię np. w odczycie i depakowaniu katalogu z zipami. Program robi swoje a w tle wątek pracuje nad katalogiem i powiadamia mnie gdy skończy.
SH
W takim wypadku wątki są wręcz konieczne, by aplikacji nie zmroziło. Jeśli wątek jest odseparowany od reszty to ok, ale ciężko jak masz błąd w kodzie, a kilka wątków korzysta z tych samych obiektów. Źle rozwiążesz synchronizacje to błędy (które wystąpią co np. dwudzieste uruchomienie aplikacji, weź to debuguj...), za dużo dowalisz synchronizacji nieprzemyślnie, watki Ci się zakleszczą.
wedlock
Racja . A IDE już nie pomoże podkreśleniem na czerwono :)
SH
Nie znam gorszego typu błędów, jeśli program się kompiluje, ale daje złe wyniki i to co 20-te uruchomienie.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.