Нет;synchronized
не позволяет нескольким потокам одновременно выполнять метод в том же экземпляре.Если у вас есть n экземпляров, может быть n потоков, каждый из которых выполняет метод в одном из экземпляров.
Если вам нужно убедиться, что только один поток можетвыполнить метод во всех случаях, вы должны сделать метод static
или сделать метод не-synchronized
и вместо этого использовать блок synchronized
внутри метода для блокировки поля private static
.
Edit: Обратите внимание, что синхронизация с переменной экземпляра private
предпочтительнее, чем метод synchronized
или синхронизация с this
, и что блокировка переменной экземпляра private static
предпочтительнее, чем метод static synchronized
илиметод экземпляра, который синхронизируется на this.getClass()
.Причина в том, что this
и this.getClass()
являются ссылками на объекты, которые доступны по всей программе, поэтому любой может синхронизироваться с этими объектами и тем самым блокировать потоки, которые хотят вызвать ваш метод.
Редактировать: Также,см. комментарий Коуэна ниже - сводка: если вы действительно хотите заблокировать класс, вы можете использовать synchronized (Worker.class)
вместо synchronized (this.getClass())
, в зависимости от того, какой эффект вы хотите получить в случае подкласса.