Рассмотрите следующий класс.Метод синхронизации предотвращает обновление полей объектов?
public class Counter{
private Lock lock = new Lock();
private int count = 0;
public int inc(){
lock.lock();
int newCount = ++count;
lock.unlock();
return newCount;
}
public int incBy2() {
syncronized(this){
count+=2;
return count;
}
}
В настоящее время Thread T1 вызывает метод inc() и T2 вызывает incBy2(). Здесь есть условия гонки? или будет блокировка T2 this
, тем самым предотвращая метод inc для вызова lock.lock()
?
Когда я syncronize на 'this', я неявно блокирую другие потоки, чтобы получить доступ к полям, которые в этом случае являются объектом блокировки. –
@brain: нет. Джон прав. Приобретение монитора на этом не делает ничего, чтобы отказать в доступе к потоку. –
@brainstorm, как сказал Натан, но добавить. Вы блокируете другие потоки от доступа к критическим разделам, а не к полям. Синхронизация на 'this' говорит, что любой вызывающий, который пытается« синхронизировать »на' this', должен будет дождаться завершения. Как вы можете видеть, поскольку '' sychronize (this) 'in' inc() 'не существует, то другой поток не должен ждать. –