Je comprends que la méthode statique ne garantit pas la sécurité des threads. Parce que même s'il existe une méthode de classe unique dans toute l'application, cette méthode peut être appelée simultanément et peut entraîner des problèmes de sécurité des threads si vous ne faites pas attention. Mais que se passe-t-il lorsque cette méthode de classe n'affecte aucune variable globale? Est-ce que Thread Safe est toujours? Par exemple, j'ai ce code:
public static String convertToString(int i) {
return String.valueOf(i);
}
Si 2 threads ou plus devaient appeler cette méthode simultanément, est-ce thread safe?
3 Réponses :
Oui, cette méthode est thread-safe. Le problème avec la sécurité des threads se produit lorsque la méthode statique essaie de faire quelque chose de plus complexe, comme le partage de données.
Pour en savoir plus,
public static String convertToString(int i) {
return String.valueOf(i);
}
la méthode ci-dessus fonctionne uniquement sur le paramètre i , qui réside sur la pile. La pile est locale au thread, donc elle est parfaitement thread-safe.
Fondamentalement, vous avez besoin d'une synchronisation lorsque vous effectuez des des opérations non atomiques a> comme une variable d'incrémentation ( i ++ ) - mettre à jour sa valeur, puis lire etc.
Une telle opération comme la lecture de valeur (attention avec double et long ) est une opération atomique par définition donc elle est thread-safe
Votre formulation sur cette partie est un peu ambiguë. On pourrait le lire comme suit: " i ++ est une opération atomique".
Oui, c'est thread-safe. Tant que la méthode statique ci-dessus ne lit / ne modifie pas la référence ou la valeur mutable partagée. Par exemple: -
private static int counter = 0;
public static String convertToString(int i) {
//this has race conditions.
counter++;
return String.valueOf(i);
}
" Si 2 threads ou plus devaient appeler cette méthode simultanément, est-ce thread-safe? " - Oui.
il contient déjà une question et une réponse: stackoverflow.com/questions/13910976/... .
Il n'y a pas d'état partagé, donc oui.
Merci d'avoir partagé ce lien. Il a donné une réponse claire et concise. Merci.