Эта тема безопасна? - PullRequest
       22

Эта тема безопасна?

7 голосов
/ 10 сентября 2010

Я пишу приложение для Android и использую рабочие потоки для обработки определенной информации. Прочитав мой код, я теперь не уверен, является ли он потокобезопасным.

Я написал упрощенную версию своего кода, я опустил объект Handler, используемый для связи с основным потоком и, очевидно, сам процесс.

public class myClass implements Runnable
{
    private String myString;

    @Override
    public void run()
    {
        myString = "Some Value";
    }
}

Это вызвано выполнением чего-то похожего на это.

myClass class = new myClass();
Thread thread = new Thread(class);
thread.start()

Итак, этот код не является потокобезопасным, потому что я изменяю myString (объявлен в основном потоке) в функции run()?

Ответы [ 2 ]

4 голосов
/ 10 сентября 2010

Само по себе это потокобезопасно.Но какие потоки будут читать значение myString?Если вы прочитали его из основного потока после записи в новом потоке, то не является потоко-безопасным.

2 голосов
/ 10 сентября 2010

Нет, как вы и представляли, это потокобезопасно.Если вы сделаете геттер для переменной myString, у вас есть потенциальная проблема с многопоточностью.В этом случае вы захотите синхронизировать метод getter / setter или, что еще лучше, сделать переменную volatile, что обеспечит одинаковое значение переменной для каждого потока.

...