#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
Комментариев нет:
Отправить комментарий