2009-10-23 11 views
1

Je travaille sur un projet où nous utilisons MULE et Spring. Dans le contexte, nous créons des beans qui fournissent les services. Tous les haricots sont essentiellement des singletons sans fil. Est-ce une façon populaire/recommandée d'écrire des services?Spring + Thread safe singletons

+0

J'ai trouvé une URL http://blog.webscale.co.in/?p=64 dit que l'injection de printemps n'est pas threadsafe! Contradiction!! Quelqu'un peut-il aider s'il vous plaît? –

Répondre

2

Par défaut, un haricot au printemps sera un singleton et c'est un scénario très commun que vous décrivez.

0

Cela peut poser des problèmes de performance. Si vous avez plusieurs threads en compétition pour le même service. Le bean est défini comme un thread sécurisé, de sorte que l'accès à partir de différents threads serait efficacement sérialisé.

+0

Ce n'est vraiment un problème que si vous faites des blocs synchronisés sur une sorte d'état partagé. Si vous ne verrouillez pas les accès simultanés, la différence de performances pour l'utilisation d'un singleton est négligeable. –

+0

C'est le problème que j'aimerais explorer; AFAIK tente d'accéder à un singleton sera sérialisé. Le fait qu'il s'agisse d'un singleton threadless signifie qu'il n'est pas nécessaire de le verrouiller. Ainsi, comme bugspy.net suggère l'accès sera sérialisé. Sûrement c'est un inhibiteur de l'évolutivité? – user195166

+0

Je ne suis pas sûr que l'accès à singleton est automatiquement sérialisé par Spring. Vérifie ça. Je pense que c'est la responsabilité du singleton de sérialiser et de verrouiller tout ce qui doit être verrouillé – GabiMe

0

Dans notre service RESTFul nous avons créé nos points d'entrée sur un

@com.sun.jersey.spi.resource.PerRequest

base

et

@org.springframework.context.annotation.Scope("request")

qui maintient notre débit jusqu'à mais nous surveillons de faire en sorte que GC est bon assez pour ne pas gonfler l'application.

Les singletons de printemps sont intrinsèquement thread-safe et c'est la portée par défaut - qui fonctionne assez bien car nous les utilisons dans toutes nos applications web.

+0

Je suis assez nouveau au printemps alors s'il vous plaît ours avec moi .. Quand vous dites "Printemps singletons sont intrinsèquement thread-safe"; Ne dois-je pas encore écrire mon code dans le bean de manière sûre pour que cela soit vrai, c'est-à-dire que je ne devrais pas créer une nouvelle instance de variables au niveau du module car le prochain thread pourrait les utiliser? – user195166

+1

Eh bien, si vous utilisez Spring pour son "injection de dépendance", alors vous ne vous souciez pas du cycle de vie, donc vous n'instanciez pas manuellement vos beans - c'est pourquoi vous avez Spring. Donc, fondamentalement, vous dites à Spring que la classe 'A' doit être injectée dans la classe' B' et Spring crée 'A' et' B' et "injecte" une instance de 'B' dans une instance de' A'. Par défaut, Spring crée des instances ** singleton ** des deux beans, mais vos classes doivent être intrinsèquement sûres, c'est-à-dire qu'elles doivent être sans état. Si vous devez conserver l'état, vous avez probablement besoin d'un prototype, d'une requête ou d'une étendue de session. –

+0

Jetez un oeil à cela sur les portées http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-scopes –

Questions connexes