Android синхронизируется? - PullRequest
0 голосов
/ 26 июня 2011

Я не до конца понимаю, что делает блок синхронизации и почему это необходимо.Может ли кто-нибудь объяснить способом «синхронизации для чайников»?

В книге, которую я читаю, автор говорит мне: «Синхронизация необходима, поскольку членами, которыми мы манипулируем в синхронизированном блоке, можно манипулировать вметод onPause () в потоке пользовательского интерфейса. "Он создает объект с именем stateChanged и создает его как новый объект.Затем в блоке синхронизации он использует объект stateChanged в качестве аргумента.Все это сбивает меня с толку, и я не люблю двигаться дальше, пока не очень хорошо понимаю, что происходит.

Ответы [ 3 ]

1 голос
/ 26 июня 2011

Книга, которую нужно прочитать, - это «Параллелизм на практике на Java».

Вы должны просто отделить эту идею от Android, хотя ваш код будет работать на Dalvik, это концепция Java.Не Android.

Синхронизированный блок принимает объект в качестве параметра, любой объект, и когда поток входит в тело синхронизированного блока, любой другой поток, который запускается в синхронизированный блок с тем же экземпляром (объект), поскольку параметр должен ждать завершения предыдущего.Это очень простое описание.

Это целое подразделение информатики, и без серьезного изучения вы, вероятно, не поймете его.

1 голос
/ 26 июня 2011

Классический пример: представьте, что у вас есть два потока операций, и оба они ссылаются на один и тот же метод:

public void addToGlobalVar(int y) {
int x = globalVar;  //what if a thread stops right after this line?
x += y;
globalVar = y;
}

, где globalVar - это другое предопределенное число, с которым этот метод может взаимодействовать, изадавать.Допустим, globalVar равен 50.

Потоки вычисляют время вычислений несколько произвольно, поэтому вы никогда не будете полностью знать, какая точная наносекунда останавливается, а другая получает время ЦП.

В этом примере, есливы запустили AsyncTask в дополнение к потоку пользовательского интерфейса, и оба в какой-то момент используют addToGlobalVar(10), что может случиться так, что один поток может быть прерван во второй строке этого блока кода.Если другой поток проходит, пока тот спит, он успешно установит globalVar равным 60. Но когда другой пробуждается, он все еще думает, что x = 50, и затем собирается установить его равным 60. Так что, по сути, вы простосделал 50 + 10 + 10 = 60. Надеюсь, вы можете увидеть, как это становится проблемой.

Вы можете исправить этот простой пример, сделав расчет атомарным (пропустите объявление x, 1 строка, все вычисления сделаны) или еслилогику не удалось сжать до 1 строки, вы делаете атомарный блок кода с помощью synchronized.

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

Вы должны полностью понять это, прежде чем использовать его.Это стандартная синхронизация Android с использованием объектно-ориентированных мониторов.Вы должны понимать это для написания многопоточных программ, однако это как-то устарело (лучше использовать java.util.concurrent для всего, что связано с потоками / синхронизацией).

В любом случае - вам нужно знать, о чем идет речь- прочитайте соответствующую часть учебника по Java:

http://download.oracle.com/javase/tutorial/essential/concurrency/sync.html

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