web-dev-qa-db-fra.com

Comment le Spring Bean Handle-t-il la concurrence?

Mon application Web utilise Spring CIO. Ainsi, tous mes haricots printaniers seront singleton (par défaut). Dans le cas où deux demandes essaient d'accéder à deux méthodes différentes d'une même classe. Par exemple: MySpringBean est une classe qui a deux méthodes searchRecord et insertRecord methods.If au même instant, les deux méthodes sont essayées via le même bean.

Comment le même haricot de printemps est-il disponible pour les deux clients en même temps ou est-ce que ce sera un problème de simultanéité lorsque les deux demandes essaieront d'accéder à deux méthodes différentes mais via le même haricot de printemps. et comme le bean printanier est singleton, la nouvelle instance ne peut donc pas être formée. Dans ce cas, comment cela va-t-il fonctionner?

16
Rajeev Akotkar

Vous devez d’abord comprendre à quel moment la concurrence peut causer des problèmes. Si votre bean Spring est sans état (il ne contient aucun champ, tous les champs sont final ou tous ne sont affectés qu'une seule fois), plusieurs threads peuvent utiliser en toute sécurité le même bean, voire la même méthode.

Voir également:

10
Tomasz Nurkiewicz

Si le haricot est un singleton, alors Spring vous donnera la même instance dans n'importe quel thread. C'est à vous de rendre cette fève fil-safe. Comme c'est un singleton, vous feriez mieux de rendre cette classe apatride.

5
hertzsprung

Comme d'autres l'ont déjà suggéré, Spring fournira la même instance à tous les threads dans le cas des haricots "singleton".

Ce que vous devez comprendre, c'est que les threads effectuent tout le travail dans un système en exécutant le code, tandis que les objets fournissent l'état et le comportement (code). Il est donc effectivement possible que plusieurs threads (demandes dans votre cas) exécutent simultanément les mêmes méthodes dans un bean singleton. Vous pouvez soit rendre ces fèves apatrides comme suggéré par Tomasz, soit les rendre "thread-safe".

5
Raghuram

Java singleton et spring singleton sont différents. La portée du singleton Spring sera disponible dans le contexte.

La portée du singleton Java sera dans le chargeur de classes JVM. Par conséquent, les demandes simultanées ne sont possibles que dans des contextes printaniers.

0
Mohamed Salih