实例变量和线程

时间:2011-06-29 15:01:26

标签: java multithreading volatile

我有一个类似下面的类,我想知道,这是线程安全的还是主线程和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));
        }
    }
}

2 个答案:

答案 0 :(得分:4)

变量是final,因此在构造函数(在本例中为空)返回之前,所有线程都可以看到它。

答案 1 :(得分:0)

volatile表示每个线程都不会保留字段值的缓存。如果您能够写入mCache字段,那么如果您想要确保另一个线程在另一个线程设置后立即读取该字段时获得新值,则将其声明为volatile。