Запрашиваемая о многопоточности, массивах и кеш-памяти - PullRequest
0 голосов
/ 26 ноября 2010

Надеюсь, в хорошем смысле :-) Я написал этот кусок кода.Что я хотел сделать, так это создать что-то вроде «кеша».Я предполагал, что мне нужно следить за разными потоками, поскольку многие вызовы могут попасть в этот класс, поэтому я попробовал функциональность ThreadLocal.Базовый шаблон имеет «МНОЖЕСТВО НАБОРОВ ВЕКТОРА». Вектор содержит что-то вроде: VECTOR.FieldName = "X" VECTOR.FieldValue = "Y" Так много векторных объектов в наборе.Разный набор для разных звонков с разных машин, пользователей, объектов.

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

Nicepart: Bufferedline - это разделенная линия на основе некоторого разделителя из файлов данных.Файлы могут быть любого размера.

Итак, как вы видите этот код?Должен ли я беспокоиться?Я прошу прощения за размер этого сообщения!

1 Ответ

0 голосов
/ 26 ноября 2010

Написание правильного многопоточного кода не так просто (т. Е. Ваш синглтон не может быть), поэтому старайтесь полагаться на существующие решения, если это возможно.Если вы ищете поточно-ориентированную реализацию Cache в Java, проверьте это LinkedHashMap .Вы можете использовать его для реализации LRU-кэша collection.synchronizedMap () .может сделать этот потокобезопасным.

...