Kategorie szkoleń | Egzaminy | Kontakt

Odpowiedź (1)

  • 3

Przykład:

 

 

Można odpowiedzieć krótko: bo tego wymaga od nas specyfikacja języka Java (JLS). Koniec i kropka. Ale dociekliwy programista może nie do końca poczuć się usatysfakcjonowany taką odpowiedzią.

Spróbuję odpowiedzieć na to pytanie nieco szerzej. Otóż przypomnijmy sobie z kursu JPR lub OCPJP, jak długo żyją zmienne lokalne (także lokalne zmienne referencyjne) zadeklarowane w metodzie – otóż czas ich życia jest ograniczony do zasięgu metody (czyli relatywnie krótki).

Natomiast stworzona w metodzie instancja klasy anonimowej lub lokalnej może istnieć o wiele dłużej (czyli czas życia relatywnie długi względem czasu życia metody).

Teraz popatrzmy, metoda main(...) mogłaby już dawno zakończyć się, a wątek t1 dopiero co zostałby uruchomiony, następnie wywołałby metodę run(). I teraz czas na pytanie: Jaką wartość zmienna  counter powinna mieć w tym danym momencie: 1, 2, 5 czy może 0 w przypadku, gdy wątek główny metody main(...) wyszedł już z jej zasięgu i zmienna lokalna counter metody main(...) mogłaby ulec „zniszczeniu”? W uproszczeniu, można sobie ten mechanizm wyobrazić następująco: kompilator tworzy kopię zmiennej counter, nazwijmy ją counter’, i jeżeli zmienna lokalna counter została oznaczona jako final (jest wtedy traktowana raczej jak stała), to wówczas do counter’ jest przypisywana wartość prymitywu z counter (int w naszym przypadku) albo kopia referencji w przypadku zmiennej referencyjnej.

Jeśli zmienna NIE byłaby oznaczona jako final, kompilator wraz maszyną wirtualną musiałby pilnować oraz synchronizować wszelkie zmiany dokonane na zmiennej lokalnej counter w metodzie main(...), co w konsekwecji mogłoby doprowadzić do nieprzewidywalnych zachowań lub niejednoznaczności w interpretacji wartości odczytanych we wnętrzu klasy anonimowej.

  • Odpowiedział
  • @ | 10.11.2014
  • TRENER ALTKOM AKADEMII