#java #android #многопоточность #synchronized
Интент-сервис регистрации/логина в приложении.
@Override
protected void onHandleIntent(Intent intent) {
try {
// ЗАЧЕМ ?
synchronized (TAG) {
// [START register_for_gcm]
// Initially this call goes out to the network to retrieve the token,
subsequent calls
// are local.
// [START get_token]
InstanceID instanceID = InstanceID.getInstance(this);
String token = instanceID.getToken(
getString(R.string.gcm_defaultSenderId),
GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
// [END get_token]
if (intent.getStringExtra("state").equals("registration")) {
//make registration request with callback
} else if (intent.getStringExtra("state").equals("login")) {
//make login request with callback
}
subscribeTopics(token);
// [END register_for_gcm]
}
} catch (Exception e) {
}
}
Вопросы:
Зачем тут используется synchronized() ?
Для чего в целом нужен synchronized() , где его использовать?
Читал про многопоточность, но не особо понял что и как.
Буду рад объяснением простыми словами.
Ответы
Ответ 1
Простыми словами: если у вас есть переменные, которые изменяются в одном из потоков, и читаются в другом, то их использование нужно синхронизировать. То есть, заключать их использование в блок synchronized. Использование блока synchronized исключает одновременное выполнение этих блоков (синхронизирующихся по одному и тому же объекту) разными потоками. Зачем именно тут используется synchronized — скорее всего, какая-то часть кода внутри работает с разделяемыми переменными.Ответ 2
В вашем примере используется synchronized-блок чтобы сделать потокобезопасным код внутри блока, т.е. если этот код уже выполняется в каком-то потоке, то другой поток не сможет начать выполнение этого кода, пока предыдущий поток не завершит выполнение. Подробно о синхронизации и многопоточности лучше читать в официальной документации java
Комментариев нет:
Отправить комментарий