2017-10-12 3 views
3

Question 1) D'après ma compréhension, le ressort crée des objets singletons, donc quand j'ai un contrôleur comme ci-dessous avec un service automatique, cela affectera la sécurité des threads.Les objets autowired dans springs mvc threadsafe?

Question 2) Si je déclare une variable de type int au niveau de la classe et l'utilise dans le contrôleur ou le service, cela affectera-t-il la sécurité des threads?

@Controller 
public class LoginController { 

    @Autowired 
    public DaoService daoservice; 

    @RequestMapping("/") 
    public String getBookInfo() { 
     Book book = daoservice.getBookbyId(1L); 
     System.out.println(book.getTitle()); 
     return "welcome"; 
    } 
} 


@Service 
public class DaoService { 

    @Autowired 
    public BookRepository BookRepo; 

    public Book getBookbyId(Long Id) { 
     Book book = BookRepo.findOne(Id); 
     return book; 
    } 

} 
+0

La sécurité du fil n'a rien à voir avec le fait que quelque chose soit un singleton ou non (ou géré par Spring ou non). Ce qui rend les classes non sécurisées par les threads est l'état mutable partagé. Dans votre exemple, il n'y a pas d'état partagé. Maintenant, si vous partagez/maintenez le résultat de 'findOne' dans une variable de niveau classe, il ne sera pas thread-safe (car plusieurs threads pourraient modifier simultanément l'instance partagée unique). –

Répondre

2

Q.1: les haricots printemps threadsafe?
Réponse: n °
Le ressort ne vous donne pas de sécurité de fil pour leur haricot. Le ressort fournissent le type différent de la portée de haricot comme (prototype, singleton etc.). Si Prototype alors un nouveau bean crée chaque fois qu'il invoque où un bean singleton a été créé pour une fois et partagé en application context.

Si vous pensez à la demande HTTP, alors 2 demandes ou plus peuvent apparaître. De ce fait, une nouvelle instance d'un bean est créée dans chaque portée de requête. Donc, vous pouvez penser qu'ils sont thread sûr dans le contexte de la demande HTTP mais ce n'est pas vraiment thread-safe par le printemps lui-même.Parce que plusieurs threads peuvent partager le bean dans le même contexte de demande HTTP.

Q.2: Les threads de classe variable sont-ils sûrs?
Réponse: Non
Cité de here
Toutes les variables privées sont partagées membres. Ils peuvent être définitifs, mais cela signifie seulement que les références ne peuvent pas être modifiées. Tout état mutable doit être synchronisé.

+0

Votre réponse :: Si vous pensez à une requête HTTP, alors 2 demandes ou plus peuvent venir. Une nouvelle instance d'un bean est créée dans chaque portée de requête. Question) pour la requête HTTP que vous avez mentionnée si deux ou plusieurs demandes sont arrivées, la nouvelle instance d'un bean est créée, Pouvez-vous expliquer quel bean est créé ici pour chaque requête –

+0

C'est le point où je suis confus, Si le contrôleur est singleton , Comment peut-il être thread sûr pour chaque nouvelle demande –

+0

J'ai déjà dit * mais ce n'est pas vraiment thread safe par le printemps lui-même *. Pour être clair, sauf * singleton * ou * prototype *, il existe d'autres possibilités comme * request *, * session *. Je dis pour la portée de la demande. Peut être mon premier commentaire est un peu confus donc. vos '@ Controller' sont dans la portée de la requête. –