2010-11-26 13 views
0

私は良い方法で望みます:-) 私はこのコードを書いています。 私がやりたいことは、 "キャッシュ"のようなものを構築することです。 多くの呼び出しがそのクラスに到達するのと同じように、私は別のスレッドを監視しなければならないと思ったので、私はThreadLocal機能を試しました。 VECTOR.FieldName =「X」セットで VECTOR.FieldValue =「Y」 非常に多くのベクトルオブジェクト: 基本パターンは が ベクトルのようなものを保持している「VECTORの多くのセット」を持っています。異なるマシン、ユーザー、オブジェクトからの異なる呼び出しに対して異なるセット。スレッディング、配列、およびキャッシュメモリについて質問する

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); 
     } 

だから...私は添付でそれを持っていると私はこのようにそれを使用します。

CachedVector cache = CachedVector.getInstance(bufferedline); 

素敵な部分は:Bufferedlineは、データファイルからいくつかの区切り文字に基づいて分割さラインです。ファイルのサイズは任意です。

このコードはどのように表示されますか?私は心配すべきですか? このメッセージのサイズをお詫び申し上げます!

+0

あなたのシングルトンはスレッドセーフではありません。 –

+0

'101010'ボタンを使用してコードスニペットをフォーマットしてください – khachik

+0

' ThreadLocal'の使用は推奨されません(「効果的なJava 2nd ...」を参照)。 –

答えて

0

正しいマルチスレッドコードを書くのは簡単ではありません(シングルトンは失敗します)。可能であれば、既存のソリューションに頼ってみてください。 Javaでスレッドセーフなキャッシュ実装を探している場合は、LinkedHashMapをチェックしてください。それを使用してLRU cacheを実装することができます。そしてcollections.synchronizedMap()。このスレッドセーフなものにすることができます。

+0

このコードの誤りは自然な方法で記述できますか?シングルトンは大丈夫であるはずなので、私は少なくともシングルトンを想定しています。 – hephestos

+0

これから何かが狂ってしまう。しかし、ドキュメントでは、ベクトル自体が同期されているので、同期されたクラスを「トレッドセッション」で読み込むのは安全ではありませんか? – hephestos

関連する問題