Как синхронизировано (это) работает?

#java #android #multithreading

#java #Android #многопоточность

Вопрос:

У меня есть фрагмент примерно такого,

Объект MyServiceConnection = new MyServiceConnection();

 class MyServiceConnection implements ServiceConnection {

    @Override
    public void onServiceDisconnected(ComponentName name) {
        myNotificationBinder = null;
        myBinderService.broadcastServiceIsDown();
    }

    @Override
    public void onServiceConnected(ComponentName name, IBinderService service) {
        synchronized(this) {
            mNotificationBinder.broadcastServiceIsUp();
                try {
                    notifyAll();
                } catch(RemoteException e) {
                   Log.e(TAG, "Remote exception : "   e);
                }
            }
        }
    }
}
  

Класс MyServiceConnection имеет только один объект, используемый в моем проекте. Рассмотрим, что два потока обращаются к этому одновременно t1 и t2 , но по-разному, скажем,

t1 включен ли доступ onServiceConnected и получена ли блокировка obj . Теперь поток t2 сможет получить доступ onServiceDisconnected до t1 завершения своего выполнения в onServiceConnected ?

Ответ №1:

Поскольку onServiceDisconnected не синхронизировано, то t2 не будет блокироваться при его вызове. Синхронизация влияет только на другие потоки, которые синхронизируются с одним и тем же объектом. Объект, используемый с ключевым словом synchronized, не имеет никакого особого значения, кроме этого.

Ответ №2:

Да, вы сможете вызвать любой другой метод и выполнить любой другой код за пределами synchronized (это). Если другой код в вашем классе не вызывает synchronized (this), этот код может выполняться любым количеством потоков одновременно