Страницы

Поиск по вопросам

суббота, 28 декабря 2019 г.

зачем нужен synchronized()

#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

Комментариев нет:

Отправить комментарий