Переменные экземпляра и потоки - PullRequest
1 голос
/ 29 июня 2011

У меня есть класс, подобный приведенному ниже, и мне интересно, будет ли он потокобезопасным или может основной поток и поток 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));
        }
    }
}

Ответы [ 2 ]

4 голосов
/ 29 июня 2011

Переменная является конечной, поэтому она будет видна всем потокам до того, как возвращается конструктор (в данном случае пустой).

0 голосов
/ 29 июня 2011

volatile означает, что каждый поток не будет хранить кэш значения поля.Если бы вы могли писать в поле mCache, вы бы объявили его энергозависимым, если вы хотите быть уверены, что другой поток получил новое значение при чтении поля сразу после того, как оно было установлено другим потоком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...