Запрашиваемая о многопоточности, массивах и кеш-памяти
Я надеюсь в хорошем смысле:-) Я написал этот кусок кода. Что я хотел сделать, так это создать что-то вроде "кеша". Я предполагал, что мне нужно следить за различными потоками, поскольку многие вызовы могут попасть в этот класс, поэтому я попробовал функциональность 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);
Хорошая часть: Bufferedline - это разделенная строка на основе некоторого разделителя из файлов данных. Файлы могут быть любого размера.
Итак, как вы видите этот код? Должен ли я беспокоиться? Я прошу прощения за размер этого сообщения!
1 ответ
Написание правильного многопоточного кода не так просто (т. Е. Ваш синглтон не справляется), поэтому постарайтесь полагаться на существующие решения, если это возможно. Если вы ищете поточно-ориентированную реализацию Cache в Java, посмотрите этот LinkedHashMap. Вы можете использовать его для реализации кэша LRU. И collection.synchronizedMap (). может сделать этот потокобезопасным.