2017-02-17 1 views
0

Je crée un jeu en utilisant java et à un moment donné, je crée un thread pour initialiser une classe qui initialise d'autres classes, etc. Après que je l'ai fait non actif, mon thread principal accède à la classe I initialisée et appelle une méthode qui utilise des variables initialisées en utilisant l'autre thread qui appelle ensuite les méthodes d'une autre classe qui a des variables initialisées par l'autre thread etc. pour initialiser un grand nombre de variables en utilisant un thread séparé qui est dans un tas de classes différentes, ai-je besoin de rendre toutes les variables que j'initialise volatiles ou y at-il un meilleur moyen pour que toutes les variables que j'initialise accessible par d'autres threads.Multithreading --Comment devez-vous initialiser les variables sans utiliser le mot-clé volatile en permanence

Cette question ne devrait pas devrais-je utiliser le mot-clé volatile c'est plus ou un, devrais-je pas utiliser le mot-clé volatile et y at-il une meilleure option qui rend beaucoup de mes variables volatiles.

Aussi, si cela aide, mon programme a une structure orientée objet.

+0

Pourquoi utiliser un thread séparé pour initialiser des variables? – Kayaman

+0

Les données que j'initialise prennent un peu de temps à charger et je veux que le programme affiche un certain nombre de choses différentes pendant qu'il se charge comme un écran de chargement, sauf que cela ne prend pas trop de temps. – retodaredevil

+1

Non, vous ne devriez pas rendre toutes vos variables volatiles. Vous pouvez créer un thread distinct pour l'animation de l'écran de chargement, et lorsque l'initialisation est prête, arrêtez ce thread et continuez normalement. Maintenant, vous l'avez un peu en arrière. – Kayaman

Répondre

0

Je pense que vous êtes confus quant à l'utilisation du mot-clé volatile. Vous n'utilisez pas le mot clé volatile pour rendre les variables visibles aux autres threads. volatile est utilisé pour établir une relation qui se produit avant l'écriture entre une écriture et une variable et les lectures suivantes de cette variable. Ceci est accompli en forçant la variable à être lue dans la mémoire principale chaque fois qu'elle est lue plutôt que de permettre à la variable d'être lue à partir d'un cache de CPU.

Vous n'avez rien de spécial à faire pour rendre un objet ou des éléments d'un objet visible aux autres threads.

+0

* "Vous n'utilisez pas le mot-clé volatile pour rendre les variables visibles aux autres threads." * ... en l'occurrence, c'est exactement la raison pour laquelle vous utilisez le mot-clé "volatile". Le modificateur 'volatile' fournit une forme de sécurité de thread faible en fournissant de la visibilité, mais en lui-même ne fournit rien pour l'atomicité ou l'exclusion mutuelle ... et, ainsi,' volatile 'est réellement incapable de garantir une relation before-before composé de plus d'un seul champ. – scottb

+0

* "Vous n'avez pas besoin de faire quelque chose de spécial pour rendre un objet ou des éléments d'un objet visible aux autres threads." * ... ceci est irrémédiablement et indubitablement faux. – scottb

+0

@scottb 'volatile' ne fournit pas la visibilité d'un champ à d'autres threads. Il fournit la visibilité de _changes_ à cette variable à d'autres threads. Pouvez-vous fournir un lien pour sauvegarder ce que vous dites ici? – Neatname