Весна и синхронизация для части метода - PullRequest
2 голосов
/ 16 августа 2010

У меня есть менеджер в виде Spring Wired Bean.Я считаю, что каждый компонент, определенный для весны по умолчанию, связан как синглтон.У меня есть несколько методов в этом бине, которые мне нужно синхронизировать.Как мне тогда это делать -

void zzz() {
 synchronized (this) {
   ...
 }
}

или

void zzz() {
 synchronized (MyClass.class) {
   ...
 }
}

?

Ответы [ 2 ]

4 голосов
/ 16 августа 2010

Основное различие между ними заключается в том, что в первом случае экземпляр класса используется в качестве монитора, а во втором - класс в качестве монитора.

Первый способ - это, вероятно, путь в вашем случае, потому что в ближайшем будущем, если вы решите иметь много экземпляров вашего класса, их методы будут синхронизированы в соответствующих экземплярах. В отличие от того, если вы используете класс в качестве монитора, если один поток вызывает синхронизированный метод для одного экземпляра, никакие другие потоки не смогут вызывать методы (синхронизированные) для любых экземпляров того же класса.

1 голос
/ 16 августа 2010

Если у вас нет доступа к изменяемым статическим переменным класса (потенциально неприятно для начала), первый - подходящий способ синхронизации.

Поймите, что пока Spring создает только один экземпляр одноэлементного компонента и используетдля любого, кто зависит от bean-компонента этого типа, синглтон не статическая сущность.Нет ограничений компилятора, препятствующих созданию экземпляра этого класса самостоятельно вне контекста Spring.Это просто единственный случай, потому что Spring знает, чтобы не делать больше из них ... не потому, что это невозможно сделать.Суть, которую я пытаюсь здесь подчеркнуть, заключается в том, что неправильно граничить с неправильным, чтобы провести параллель между данными уровня класса и данными синглтона.

В результате синхронизация должна происходить в самой узкой области действия.В вашем случае это означает синхронизацию с экземпляром объекта, содержащим общие данные, а не с более широкой областью действия всего класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...