我有一个像下面的类,我想知道,这将是线程安全的,或者主线程和Loader
线程可能有自己的mCache
副本,因此get(..)方法无法从缓存中检索任何内容,因为它是在加载程序线程中添加的?我需要标记这个volatile
?实例变量和线程
谢谢!
public class StackExample
{
private final ConcurrentHashMap<String, SoftReference<Bitmap>> mCache = new ConcurrentHashMap<String, SoftReference<Bitmap>>();
private addToCache(String key, Bitmap bitmap)
{
mCache.put(key, bitmap);
}
private Bitmap getBitmap(String key)
{
if(mCache.contains(key))
{
return mCache.get(key);
}
else
{
//add to loading queue
}
}
private class Loader extends Thread
{
@Override
public void run()
{
...//check loading queue and load some images here
mCache.put(keyString, new SoftReference<Bitmap>(loadedBitmap));
}
}
}
您将只对所有线程都具有唯一的* mCache *,但您的代码仍然没有正确同步。你*可以*输入两次(或多于)* *添加到加载队列*你的代码的一部分为同一个*键*虽然从你的例子中并不完全清楚* getBitmap *从哪里调用(它显然是私有的!?)。 – SyntaxT3rr0r
btw +1对你的问题和羞耻的人谁upvoted Jon Skeet的一个线路的答案,也没有upvoting很好的问题。 – SyntaxT3rr0r
谢谢!是的,只是一个简单的例子,我知道你的意思是关于get方法:) – Dori