Modyfikator final, a synchronizacja

0

Krótkie pytanie: Czy jeżeli mam pole z modyfikatorem final - czyli stałą, to nie ma możliwości, żeby dwa wątki dostały się do niej jednocześnie i jakoś dwukrotnie przypisały wartość?
Innymi słowy, czy jest to 100%-owy Singleton (tzn. wątki nie mogą popsuć idei Singletona)? :


public class Singleton
{
	public static final Singleton INSTANCE = new Singleton();
	
	private Singleton()
	{

	}
}

0

Pytanie nie ma nic wspólnego z kodem. W takim kodzie inicjalizacja następuje przy tworzeniu klas (nie obiektów!) bo pole jest statyczne. final nie ma tu żadnego znaczenia.
To co pokazałeś to jest singleton, ale da sie go popsuć jak ktoś umie ;) Na przykład przez serializacje/deserializacje. Ale w normalnym życiu jest ok.

0

Tak, faktycznie z tym staticiem w kodzie moje pytanie miało niewiele wspólnego :P . Niemniej jednak abstrahując od zamieszczonego kodu chciałbym się dowiedzieć czy samo final zmienna = wartość; może zostać popsute (przypisanie wielokrotnie wartości) przez wątki, które w tym samym czasie chcą ją uzyskać?

0

Nie umiem sobie tego wyobrazić o czym piszesz ;] W jakiej sytuacji miałoby to niby wystąpić?

0

Kurde... chciałem wysilić się na jakiś przykład, ale to rzeczywiście trudne do wymyślenia :P ...czyli podsumowując zadałem dwa bezsensowne pytania w 2 postach, brawo :)

1

Pola final ktore nie sa statyczne musza byc zainicjowane inline lub w konstruktorze. Zanim konstruktor sie zakonczy, zaden watek nie ma referencji do obiektu, bo to jakby chcieci zeby przed wykonaniem new Object() lub w trakcie juz byla do tego jakas referencje. Ergo, final jest niejawnie thread-safe, tak mi sie wydaje ;d

1
mućka napisał(a):

Pola final ktore nie sa statyczne musza byc zainicjowane inline lub w konstruktorze. Zanim konstruktor sie zakonczy, zaden watek nie ma referencji do obiektu, bo to jakby chcieci zeby przed wykonaniem new Object() lub w trakcie juz byla do tego jakas referencje. Ergo, final jest niejawnie thread-safe, tak mi sie wydaje ;d

Nie, nie jest tak. Zgodnie z <a href=http://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.5.2">Java Language Specification</a> jesli w konstruktorze przekazujesz gdzies referencje do this to calee moze zobaczyc czesciowo zainicjalizowany obiekt.

0

Jasne, że jest atomowe.

1

Pola static inicjalizowane są przez classloader przy ładowaniu klasy. Cała operacja zawarta jest w sekcji krytycznej, więc jesteś bezpieczny. Pamiętaj jednak, że w środowiskach z pełną izoalcją classloaderów (np. osgi) możesz skończyć z kilkoma instancjami singletona :)

0

Ale dostep z innego classloadera tylko z proxy:-)

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