मैं सूची कैश्ड है लौटने के लिए, मेरे कोड इसजावा कैश्ड वस्तु पुराने मूल्य
public class MyList {
private final List<String> cache = new ArrayList<String>();
private List<String> loadMyList() {
// HEAVY OPERATION TO LOAD DATA
}
public List<String> list() {
synchronized (cache) {
if(cache.size() == 0) {
cache.addAll(loadMyList());
}
return Collections.unmodifiableList(cache);
}
}
public void invalidateCache() {
synchronized (cache) {
cache.clear();
}
}
}
तरह लग रहा है क्योंकि सूची लोड बहुत भारी मैं एक अनुरोध मिला है कि अगर सूची लोड प्रगति पर है मैं वापस "पुराने" कैश्ड है डेटा ...
कि संभव है, और कोई मुझे कैसे यहां से आगे बढ़ने के लिए पर संकेत दे सकते हैं
संपादित करें: एडम होर्वाथ और bayou.io इस
की तरह कुछ sugestedpublic class MyList
{
private final List<String> cache = new ArrayList<String>();
private final List<String> oldCache = new ArrayList<String>();
private volatile boolean loadInProgress = false;
private List<String> loadMyList()
{
// HEAVY OPERATION TO LOAD DATA
}
public List<String> list()
{
synchronized (cache)
{
if(loadInProgress)
return Collections.unmodifiableList(oldCache);
else
return Collections.unmodifiableList(cache);
}
}
public void invalidateCache()
{
synchronized (cache)
{
// copy to old cache
oldCache = new ArrayList<String>(cache);
// set flag that load is in progress
loadInProgress = true;
// clear cache
cache.clear();
// initialize load in new thread
Thread t = new Thread(new Runnable()
{
public void run()
{
cache.addAll(loadMyList());
// set flag that load is finished
loadInProgress = false;
}
});
t.start();
}
}
}
क्या इस संपादित कोड में कोई समस्या है ?? जब से मैं बहु सूत्रण और/या अनुकूलन भुना में अनुभवी नहीं कर रहा हूँ मैं किसी भी और सभी प्रदर्शन संबंधी सुझाव देने
मैं गलत नहीं कर रहा हूँ, तो आप [CopyOnWriteArrayList] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CopyOnWriteArrayList.html) – Pshemo
मैं खोजे जा रहे मान लीजिए कि आपका मतलब है "कैश्ड" नहीं "कैश" –
आपके उदाहरण में, 'सूची()' को कॉल करने वाले लोग आपकी सूची पर एक दृश्य प्राप्त करते हैं - इसका मतलब है कि जब आप सूची को साफ़/दोबारा तैयार करते हैं, तो कॉलर्स जिनके पास अभी भी उस दृश्य की प्रतिलिपि हो सकती है एक अस्थिर स्थिति में सूची देखें। क्या आप वाकई चाहते हैं? इसके अलावा आपके उदाहरण में कोई "पुराना" डेटा नहीं है - या तो सूची खाली है या इसे कुछ मिला है लेकिन इसे लोड होने के बाद इसे फिर से अपडेट नहीं किया गया है ... – assylias