У меня есть следующий код:
@Name("myService")
@Scope(ScopeType.APPLICATION)
@Stateless
public class MyService {
private Service service;
private Service getService() {
if (service == null) {
service = Service.create(url, new QName("URL",
"Envelope"));
}
return service;
}
public synchronized Port getPort() {
return getService().getPort();
}
}
И метод getPort вызывается из разных потоков.«Service.create» занимает много времени, и я обнаружил, что на самом деле он вызывается более одного раза.Похоже, создается более одного экземпляра класса MyService, и поэтому synchronized не помогает.
Я изменил аннотации на:
@AutoCreate
@Startup
@Name("myService")
@Scope(ScopeType.APPLICATION)
И теперь все работает нормально: создается только один экземпляр и синхронизируется доступ к методу getPort ().
Может кто-нибудь объяснить, почему первый случай не работает как ожидалось?