2009-09-04 11 views
1

Existe-t-il un moyen de remplir en toute sécurité un tableau d'octets à partir de plusieurs threads (par exemple, le premier thread remplit la première moitié, le deuxième thread utilise System.arraycopy) sans se synchroniser avec Java 6 ou 7? Les bibliothèques associées à jsr166 ne contiennent que des tableaux int (AtomicIntegerArray, ParallelIntegerArray).Comment remplir un tableau d'octets à partir de plusieurs threads en toute sécurité?

+0

Merci pour cette question! Je n'ai jamais pensé lire et écrire un tableau multithread. Ce sera certainement utile sur mon générateur de monde côté serveur et le processeur! Je peux aussi diviser les calculs d'états d'image lors du chargement initial sur le client! J'utilise déjà les tableaux plats comme multidimensionnels pour la vitesse, mais ceci ^. ^. – Underbalanced

Répondre

6

Oui cela fonctionne. L'écriture dans un emplacement de tableau n'interfère pas avec les emplacements à proximité. Cependant, vous devez vous assurer que tous les threads sont terminés avant la lecture (une relation qui se passe avant). Le fait que vous utilisiez des tableaux ne fait aucune différence.

+0

Oui, la jointure est là sous la forme de Future.get(). Je m'inquiète des alignements de cache. Par exemple un tableau [8192] écrit en 4096 + 4096 est susceptible de fonctionner sans problèmes, mais 4095 + 4097 pourrait ne pas fonctionner? – akarnokd

+0

Il semble fonctionner, au moins le MD5 des données reste le même tout le temps. Je vous remercie. – akarnokd

+0

Est-ce que cela rend les tableaux d'octets Java assez lents pour un accès à un seul thread, comparé à l'écriture d'octets utilisant des opérations d'octets non atomiques? Je veux dire, en supposant que l'implémentation JIT ou arraycopy a déplacé toute vérification de limites en dehors de la boucle. –

0

Oh, cela semble être un bon moyen d'avoir mal à la tête. :) Je pense que j'irais pour un tableau par thread, et plus tard les rejoindre.

+0

J'ai essayé cette option et j'étais insatisfait. Je veux essayer l'option multi-thread. – akarnokd

+1

Mais ma proposition était de garder le threading, juste un tableau par thread, afin d'éviter les conflits. Quelle était la cause de votre insatisfaction? Performance? – crunchdog

Questions connexes