I définit une classe Element:Comment rendre mon thread de structure de données sûr?
class Element<T> {
T value;
Element<T> next;
Element(T value) {
this.value = value;
}
}
également défini une classe de liste basée sur un élément. Il est une liste typique, comme dans tous les livres de structure de données, a addHead, supprimer et etc opérations
public class List<T> implements Iterable<T> {
private Element<T> head;
private Element<T> tail;
private long size;
public List() {
this.head = null;
this.tail = null;
this.size = 0;
}
public void insertHead (T node) {
Element<T> e = new Element<T>(node);
if (size == 0) {
head = e;
tail = e;
} else {
e.next = head;
head = e;
}
size++;
}
//Other method code omitted
}
Comment puis-je faire ce fil de classe Liste sûre?
mettre synchronisé sur toutes les méthodes? Ça ne marche pas. Deux threads peuvent travailler sur des méthodes différentes en même temps et provoquer une collision.
Si j'ai utilisé un tableau pour conserver tous les éléments de la classe, alors je peux utiliser un volatile sur le tableau pour m'assurer qu'un seul thread travaille avec les éléments internes. Mais actuellement tous les éléments sont liés par l'objet refernece sur le prochain pointeur. Je n'ai aucun moyen d'utiliser volatile.
Utilisation de matières volatiles sur la tête, la queue et la taille? Cela peut provoquer des interblocages si deux threads exécutent des méthodes différentes en attente de la ressource.
Des suggestions?
Merci jay. Ceci est juste un exemple de code. Voulez-vous dire ajouter synchronisé sur chaque méthode assurera thread-safty sur la classe, mais les performances concurrentes terribles? Et si j'utilise synchronzied (this) dans chaque méthode? meilleure ou pas de différence? – Ryan
à l'intérieur est légèrement mieux - mais la vraie considération est ce que vous verrouillez. par exemple. synchronized (this) sera synchronisé sur l'instance en cours, synchronized (this.class) est effectivement global, etc. performance étant relative - mais synchronisé est un marteau contondant - il verrouillera globalement votre classe, les verrous en lecture/écriture java.util.concurrent vous donne plus de granularité, en fonction de ce que vous cherchez à faire exactement. – jayshao
java.util.concurrent donne conditionnel mais pas absolu, n'est-ce pas? Avoir à bien les gérer pour éviter les problèmes de concurrence. – Ryan