Важным отличием между этими двумя примерами является , а не в Runnable
по сравнению с расширением Thread
(на несвязанной ноте: почти никогда нет причин для расширения Thread
, вы почти всегда хотите агрегат Runnable
.
Важным отличием является то, что в первом примере оба запущенных потока совместно используют общий Bean
объект, с которым они синхронизируются! Это означает, что вызов incBalance()
не может быть выполнен обоими потоками одновременно.
Во втором примере каждый из них имеет отдельный Bean
объект, поэтому синхронизация не имеет практического эффекта.
Также обратите внимание, что опубликованный вами вывод не гарантирован: вы можете получить тот же вывод во втором примере, что и в первом (однако вы не можете получить смешанный вывод из второго примера из первого).