Proč jsou synchronizované metody řešené zvláštním příznakem v bajtkódu? Je to jen syntaktický cukr pro synchronizovaný blok kolem celé metody nad this nebo this.getClass(), tak bych čekal, že se to tak také přeloží. Vypadá to, jakoby synchronizované bloky byly do bajtkódu přidány až později, přitom jsou snad v Javě od začátku…
Ano obaleni kodu cele metody do synchronized(this) je ekvivalentni z hlediska funkce - kdyz se na aplikaci divame z pohledu Javy, vnitrne je tam vsak rozdil.
Jsou tam minimalne dva duvody o kterych vim:
1) priznak nezabere zadne misto, je soucasti vetsiho bitoveho vektoru, kde jsou ulozena prava pristupu atd. Naproti tomu monitorenter a monitorexit + instrukce okolo jiz zaberou nekolik bajtu (rekneme 10) coz je napriklad pro synchronizovany setter overkill.
2) ted z hlavy nereknu jak to dela JIT, ale synchronizace metod se bere do uvahy pro inliningu.