#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), этот код может выполняться любым количеством потоков одновременно