Java - pytanie o sekcje krytyczną

0

Zastanawia mnie następująca rzecz:

public class MyClass {
        private int id = 0;
        // getter i setter ID
        ...	

	Myclass() { }
	
	public void start() {
			...
			synchronized(this) {
                                // kod ktory chce
                                // aby byl wykonany przez 1 watek na raz
                                // ale nie wiem ile ich bedzie
				++id;
			}
		}
	}
}

W ten sposób zapewniamy obsługę sekcji krytycznej. Czy to zagwarantuje mi, że tylko jeden wątek może na raz modyfikować zmienną id bez wiedzy jak te wątki będą powstawały itp. czyli troszczy się o to JVM i to absolutnie wystarczy ?

1

Gwarantuje Ci to, że zmienna ID będzie modyfikowana tylko przez jeden wątek, O ILE nie stworzysz więcej metod, które będą modyfikowały ID bez synchronizacji LUB ktoś nie będzie dziedziczył po Twojej klasie i nie napisze sam takiej metody (akurat Ty masz zmienną private, ale gdyby to było protected, to miałoby to znaczenie) ORAZ o ile nie modyfikujesz ID w tej metodzie gdzieś POZA synchronized{...}.

0

@Newbienewb jeśli wszystkie wątki będą pracowały na jednym i tym samym obiekcie klasy MyClass to nie masz się czym martwić. Ale zastanów się czy nie lepiej użyć zmiennej volatile w takiej sytuacji ;)

0

@Shalom: Ale to zalezy do przypadku - bo byc moze jak ustawisz sobie na poczatku metody ID, to na koncu tej metody chcesz miec pewnosc, ze ta wartosc jest wciaz taka sama :p I wtedy volatile sie nie nadaje.

0

Innym rozwiazaniem jest jeszcze uzycie AtomicInteger.

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