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

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

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ć

0

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

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)

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ć.

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