Je me demandais si vous aviez une méthode statique qui n'est pas synchronisée, mais qui ne modifie aucune variable statique, est-elle thread-safe? Et si la méthode crée des variables locales à l'intérieur? Par exemple, le code suivant est-il thread-safe?
public static String[] makeStringArray( String a, String b ){
return new String[]{ a, b };
}
Donc, si j'ai deux threads appelant cette méthode de manière continue et simultanée, l'un avec des chiens (disons "grand danois" et "bull dog") et l'autre avec des chats (disons "persan" et "siamois") aurai-je un jour des chats et des chiens dans le même tableau? Ou les chats et les chiens ne seront-ils jamais à l'intérieur de la même invocation de la méthode en même temps?
Réponses:
Cette méthode est sûre à 100% pour les threads, même si ce n'était pas le cas
static
. Le problème de la sécurité des threads survient lorsque vous devez partager des données entre les threads - vous devez prendre soin de l'atomicité, de la visibilité, etc.Cette méthode ne fonctionne que sur les paramètres, qui résident sur la pile et les références aux objets immuables sur le tas. La pile est intrinsèquement locale au thread , donc aucun partage de données ne se produit, jamais.
Les objets immuables (
String
dans ce cas) sont également thread-safe car une fois créés, ils ne peuvent pas être modifiés et tous les threads voient la même valeur. D'un autre côté, si la méthode acceptait (mutable),Date
vous auriez pu avoir un problème. Deux threads peuvent modifier simultanément cette même instance d'objet, provoquant des conditions de concurrence et des problèmes de visibilité.la source
Une méthode ne peut être thread-unsafe que lorsqu'elle change un état partagé. Que ce soit statique ou non n'a pas d'importance.
la source
La fonction est parfaitement thread-safe.
Si vous y réfléchissez ... supposez ce qui se passerait si c'était différent. Chaque fonction habituelle aurait des problèmes de thread si elle n'est pas synchronisée, donc toutes les fonctions API du JDK devraient être synchronisées, car elles pourraient potentiellement être appelées par plusieurs threads. Et comme l'application utilise la plupart du temps une API, les applications multithreads seraient effectivement impossibles.
C'est trop ridicule pour y penser, donc juste pour vous: les méthodes ne sont pas threadsafe s'il y a une raison claire pour laquelle il pourrait y avoir des problèmes. Essayez de toujours penser à ce qui se passe s'il y avait plusieurs threads dans ma fonction, et que se passerait-il si vous aviez un débogueur pas à pas et que vous aviez une étape après l'autre avancer le premier ... puis le deuxième thread ... peut-être le second encore ... y aurait-il des problèmes? Si vous en trouvez un, ce n'est pas thread-safe.
Veuillez également noter que la plupart des classes de la collection Java 1.5 ne sont pas threadsafe, à l'exception de celles indiquées, comme ConcurrentHashMap.
Et si vous voulez vraiment vous plonger dans cela, examinez de près le mot-clé volatile et TOUS ses effets secondaires. Jetez un œil à la classe Semaphore () et Lock () et à leurs amis dans java.util.Concurrent. Lisez tous les documents de l'API autour des classes. Cela vaut la peine d'apprendre et de satisfaire aussi.
Désolé pour cette réponse trop élaborée.
la source
Utilisez le
static
mot - clé avec des méthodes statiques synchronisées pour modifier les données statiques partagées entre les threads. Avec lestatic
mot - clé, tous les threads créés se disputeront une seule version de la méthode.L'utilisation du
volatile
mot - clé avec des méthodes d'instance synchronisées garantira que chaque thread a sa propre copie des données partagées et qu'aucune lecture / écriture ne s'échappera entre les threads.la source
Les objets String étant immuables est une autre raison du scénario thread-safe ci-dessus. Au lieu de cela, si des objets mutables sont utilisés (disons makeMutableArray ..), alors la sécurité des threads sera sûrement interrompue.
la source