J'espère de la bonne manière :-) J'ai écrit ce morceau de code. Ce que je voulais faire, c'est de construire quelque chose comme "cache". J'ai supposé que je devais surveiller les différents threads, car de nombreux appels arrivaient à cette classe, j'ai donc essayé la fonctionnalité ThreadLocal. modèle de base est ont "de nombreux ensembles de VECTOR" Le vecteur contient quelque chose comme: VECTOR.FieldName = "X" VECTOR.FieldValue = "Y" Tant d'objets vectoriels dans un ensemble. Ensemble différent pour différents appels de différentes machines, utilisateurs, objets.Poser des questions sur l'enfilage, les tableaux et la mémoire cache
private static CacheVector instance = null;
private static SortedSet<SplittingVector> s = null;
private static TreeSet<SplittingVector> t = null;
private static ThreadLocal<SortedSet<SplittingVector>> setOfVectors = new ThreadLocal<SortedSet<SplittingVector>>();
private static class MyComparator implements Comparator<SplittingVector> {
public int compare(SplittingVector a, SplittingVector b) {
return 1;
}
// No need to override equals.
}
private CacheVector() {
}
public static SortedSet<SplittingVector> getInstance(SplittingVector vector) {
if (instance == null) {
instance = new CacheVector();
//TreeSet<SplittingVector>
t = new TreeSet<SplittingVector>(new MyComparator());
t.add(vector);
s = Collections.synchronizedSortedSet(t);//Sort the set of vectors
CacheVector.assign(s);
} else {
//TreeSet<SplittingVector> t = new TreeSet<SplittingVector>();
t.add(vector);
s = Collections.synchronizedSortedSet(t);//Sort the set of vectors
CacheVector.assign(s);
}
return CacheVector.setOfVectors.get();
}
public SortedSet<SplittingVector> retrieve() throws Exception {
SortedSet<SplittingVector> set = setOfVectors.get();
if (set == null) {
throw new Exception("SET IS EMPTY");
}
return set;
}
private static void assign(SortedSet<SplittingVector> nSet) {
CacheVector.setOfVectors.set(nSet);
}
Alors ... je l'ai dans la joindre et je l'utilise comme ceci:
CachedVector cache = CachedVector.getInstance(bufferedline);
La belle partie: Bufferedline est une ligne basée sur certains fente delimiter des fichiers de données. Les fichiers peuvent être de n'importe quelle taille.
Alors, comment voyez-vous ce code? Devrais-je m'inquiéter? Je m'excuse pour la taille de ce message!
Votre singleton n'est pas thread-safe. –
Utilisez le bouton '101010' pour formater l'extrait de code – khachik
et l'utilisation de' ThreadLocal' est déconseillée (voir Effective Java 2nd ...). –