2010-11-26 3 views
0

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!

+0

Votre singleton n'est pas thread-safe. –

+0

Utilisez le bouton '101010' pour formater l'extrait de code – khachik

+0

et l'utilisation de' ThreadLocal' est déconseillée (voir Effective Java 2nd ...). –

Répondre

0

L'écriture correcte d'un code multithread n'est pas si simple (c'est-à-dire que votre singleton ne l'est pas), essayez donc de vous appuyer sur des solutions existantes si possible. Si vous recherchez une implémentation de cache thread-safe en Java, consultez ce LinkedHashMap. Vous pouvez l'utiliser pour implémenter un LRU cache. Et collections.synchronizedMap(). peut rendre ce thread-safe.

+0

Est-il possible de décrire de façon naturelle, quelle est la faute sur ce code? Je suppose au moins le singleton, comme singleton devrait être ok. – hephestos

+0

Alors quelque chose après ça va wacko. Dans les docs cependant, les vecteurs sont eux-mêmes synchronisés ... alors ne devrais-je pas être sûr de charger simplement des classes synchronisées avec une "session de foulée"? – hephestos

Questions connexes