2 метода: m1 - не статическая синхронизация, а m2 - статическая
синхронизированы и 2 потока T1 обращаются к m1 с объектом o1 и T2
доступ к m2 может выполняться одновременно, так как m1 и m2 синхронизируются на
2 разных объекта.
нестатический метод m1 синхронизирован на this
(текущий экземпляр), статический метод m2 синхронизирован на this.getClass()
(которому принадлежит текущий экземпляр объекта класса). Они синхронизируются на различных объектах , поэтому они не могут блокировать друг друга.
В размещенном коде синхронизированный блок имеет явную блокировку монитора Foo.class
, разные экземпляры Foo
совместно используют один и тот же Foo.class
, что означает, что код синхронизируется на том же объекте . Таким образом, только один поток может войти в синхронизированный блок, другие будут заблокированы, пока он не будет существовать.