我有一个类似下面的类,我想知道,这是线程安全的还是主线程和Loader
线程可能有自己的mCache
副本因此得到( ..)方法无法从缓存中检索任何东西,因为它是在加载器线程中添加的?我是否需要标记此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));
}
}
}
答案 0 :(得分:4)
变量是final,因此在构造函数(在本例中为空)返回之前,所有线程都可以看到它。
答案 1 :(得分:0)
volatile
表示每个线程都不会保留字段值的缓存。如果您能够写入mCache字段,那么如果您想要确保另一个线程在另一个线程设置后立即读取该字段时获得新值,则将其声明为volatile。