Partage d'un objet entre les deux fils et le programme principal
Je suis nouveau sur le Java et je dois assister à un Simultanées cours de Programmation. J'essaie désespérément d'obtenir un minimum de travail exemple qui peut aider à illustrer les concepts que j'ai appris comme l'utilisation de "synchronisé" mot et le partage d'un objet à travers les threads.
Ont été à la recherche, mais ne pouvait pas obtenir un cadre de base. Les programmeurs Java, de bien vouloir nous aider.
OriginalL'auteur devnull | 2010-08-31
Vous devez vous connecter pour publier un commentaire.
Voici un shot exemple de partage d'un tableau entre deux threads. Habituellement, vous verrez tous les zéros, mais parfois les choses se tordu et vous voyez d'autres numéros.
Mais, si vous synchronisez sur
arr
autour de la boucle, vous verrez toujours tous les0
s dans l'impression. Si vous supprimez le bloc synchronisé, le code s'exécute sans erreur.arr
juste pour l'incrémentation et de décrémentation lignes: pastebin.com/vN4E527P Cela met en évidence le fait que le seul thread-dangereux pièces sont ces deux lignes.Parfois, je reçois une chaîne de nombres aléatoires. Je suis surpris. U peut m'expliquer le fonctionnement?
Ne pas arr[i % arr.longueur]-- et arr[i % arr.longueur]++ équilibre comme il est exécuté le même nombre de fois? En d'autres termes de ne pas le résultat de zéro toujours?
Oui, c'est exactement pourquoi c'est un excellent exemple de problèmes causés par le partage d'objets sur plusieurs threads. Ce qui se passe est que les deux threads tentent d'incrémenter et décrémenter le même élément dans le tableau, dans le même temps, et l'un écrase l'autre, de sorte que vous ne voyez pas toutes les
0
comme vous le devriez.merci une tonne pour l'explication et l'exemple.
OriginalL'auteur jjnguy
Un exemple simple. J'espère que vous aimez le football (ou de football). 🙂
Instancier un peu plus Joueur des objets pour le rendre plus évident.
Aussi loin que je peux voir, il va alterner entre les noms des joueurs. Mais, pas nécessairement tous les autres, parce que c'est juste la façon dont le changement de contexte des œuvres.
Instancier un peu plus, supprimer le mot-clé synchronized. ThreadA se déplace dans le Système d'appel..println(). ThreadB fait peu de temps après. Blammo.
Ok, je vais essayer moi-même avant de me critiquer.
OriginalL'auteur Mike