33 votes

Concurrence Java - écriture dans différents index du même tableau

Supposons que j'ai un tableau de données, 2 threads peuvent-ils écrire en toute sécurité dans différents index du même tableau simultanément? Je m'inquiète de la vitesse d'écriture et je veux synchroniser le bit «get index to write at» par rapport à l'écriture réelle.

J'écris du code qui me permet de supposer que 2 threads n'obtiendront pas le même index.

36voto

aioobe Points 158466

Pour les deux différents indices dans un tableau les mêmes règles s'appliquent que pour les deux variables distinctes.

Le Chapitre "les Threads et les Verrous" dans le Langage Java Specification commence par affirmer:

17.4.1 Variables Partagées

[...]

Tous les champs d'instance, les champs statiques et les éléments du tableau sont stockés dans la mémoire du tas. Dans ce chapitre, nous utilisons le terme de variable pour désigner à la fois les champs et les éléments du tableau.

Cela signifie que vous pouvez écrire en toute sécurité à deux index différents en même temps. Cependant vous avez besoin de synchroniser un de lecture/écriture pour le même indice si vous voulez vous assurer que le thread consommateur voit la dernière valeur écrite par le producteur fil.

11voto

Tomasz Nurkiewicz Points 140462

La modification de deux variables différentes dans deux threads différents est sûre. La modification de deux éléments différents dans un tableau peut être comparée à la modification de deux variables différentes sous des adresses mémoire différentes, au moins en ce qui concerne le système d'exploitation. Alors oui , c'est sûr.

1voto

chubbsondubs Points 16075

Eh bien oui, c'est techniquement vrai, mais il y a tellement de mises en garde pour cette réponse, je me sens très inquiet pour vous dire oui. Parce que pendant que vous pouvez écrire à deux endroits différents dans un tableau et que vous ne pouvez pas faire grand-chose sans se heurter à des problèmes de concurrence. La vraie question vient de ce que la prochaine allez-vous faire si vous pouviez le faire?

Si vous aviez variables compteur qui se sont déplacés sous la forme de tableaux a écrit à différents endroits, vous pourriez rencontrer des problèmes de concurrence. Il est possible que votre tableau se remplit, vous pourriez avoir deux threads tentent et d'écrire sur le même emplacement. Si vous potentiellement eu un lecteur du tableau qui pourrait se lire de la même position trop, vous aurez des problèmes de concurrence. Outre l'écriture de ne pas faire quelque chose si vous n'envisagez pas sur de le lire donc, je pense que vous auriez du avoir des problèmes de concurrence d'accès quand vous allez à ajouter le lecteur (ce qui aura pour verrouiller votre compositeurs). Puis il y a la question de savoir si vous ne bougez pas, où les discussions écrire à ce qui l'empêche d'écrire sur les données? Et si vous n'avez pas jamais déplacer la tête de où le thread écrit pourquoi êtes-vous à l'aide d'un tableau? Juste donné individu Loquets ou les variables de leur propre, pour écrire, et vraiment les garder séparés.

Sans une image complète de vos intentions en disant "oui" pourrait vous conduire en péril, sans réfléchir pourquoi vous faites ce que vous faites.

0voto

Ravi Bhatt Points 2025

Jetez un oeil à CopyOnWriteArrayList, à condition que vous êtes d'accord avec une liste de tableaux. à partir de sa documentation,

Un thread-safe variante de liste de tableaux dans lesquels toutes les opérations mutative (ajouter, définir, et ainsi de suite) sont mis en œuvre par une nouvelle copie de la sous-jacent tableau.

C'est ordinairement trop coûteux, mais peut-être plus efficace que les solutions de rechange lors de la traversée des opérations largement plus nombreux que les mutations, et est utile lorsque vous ne pouvez pas ou ne souhaitez pas synchroniser traversals, doivent encore s'opposent à l'interférence entre threads simultanés.

Et

Une instance de CopyOnWriteArrayList se comporte comme une Liste de mise en œuvre que permet simultané de plusieurs lectures, et pour les lectures à se produire simultanément avec un écrire. La façon dont il le fait c'est pour faire une nouvelle copie de la liste à chaque fois il est modifié.

Lit de ne pas bloquer, et ne payez que le coût de la volatilité et de la lecture; Les écritures ne pas bloquer lit (ou vice versa), mais seulement d'une écriture peut se produire à la fois.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X