J'ai la situation suivante:
- Une structure de données qui ne peut jamais être prolongé ( je n'ai ajouter des choses dans la queue)
- J'ai besoin d'être en mesure de garder une trace des éléments que j'ai déjà vu (j'ai un index, et, idéalement, je veux être en mesure de commencer parcourant la liste à partir de cet élément particulier)
- Je voudrais le lit pour ne jamais bloquer, et l'ajout de le nouvel élément à ne jamais verrouiller la queue de la file d'attente plutôt que de l'ensemble de la file d'attente
C'est une structure qui est fortement modifiée par plusieurs threads.
Quelle serait la meilleure structure de données pour cela?
Liste de tableaux. Ce serait l'idéal pour être en mesure d'accéder directement au dernier élément à l'aide de l'index, mais elle conduit à des modifications simultanées des exceptions. je pourrais le faire de façon synchronisée, mais éviter de verrouillage (ou tout verrouillage à part le dernier élément, comme c'est le seul où il peut y avoir des écritures simultanées pour ajouter de nouveaux éléments)
ConcurrentLinkedQueue. Cela résoudrait mes problèmes de simultanéité, mais le problème est que je dois mémoriser la position courante de l'itération plutôt que d'un index entier. C'est le problème qu'il renvoie un faiblement cohérente itérateur qui n'est pas garanti à rendement des nouveaux objets ont été ajoutés à la liste depuis l'itérateur a été créé (source: javadoc)
ConcurrentHashMap avec l'indice de touches. Ceci a l'avantage que je peux accéder à des données correspondant à l'index correct directement, mais a la question qu'il n'y a pas un getNext opérateur qui me permettra de faire efficacement parcourir les éléments de l'index, index + 1, etc
Vecteurs Cela permettrait de résoudre la plupart de mes problèmes en permettant à quelque chose qui ne va pas faire les modifications simultanées des exceptions et permettre l'accès direct. Toutefois, compte tenu de toutes les méthodes sont synchronisés, le rendement est médiocre par rapport à arraylists. Étant donné que je ne veux plus jamais d'étendre la structure, et de ne pas insérer des enregistrements dans le milieu, je suis réticent à aller pour ce poids lourd de la solution, où se lit aussi souffrir de performances (alors que, compte tenu de mon cas d'utilisation, l'index d'un élément jamais fait de changements, donc il n'y a pas besoin de synchroniser les lectures qui ne sont pas la queue)
Personnalisé structure de données: tenir un tableau des objets que je veux stocker un pointeur sur la queue de ce tableau (le dernier élément de jeu), lors de l'insertion d'un nouvel objet, verrouillage de la queue et de l'objet pointé par la queue. Lorsque l'objet dépasse sa taille actuelle, à un verrouillage opération de redimensionnement.
Quelle serait la meilleure stratégie ou toute autre application plus efficace?