если я прав, почему мы не можем использовать синхронизированный (это) вместо синхронизированного (а)?
Если вы сделали:
public void run() {
synchronized (this) {
a.increment();
}
}
this
в этом случае - это экземпляр класса включения, здесь анонимный объект Runnable, и, поскольку каждый поток имеет свой собственный экземпляр Runnable, ваша синхронизация выполняется на отдельных объектах и не будет работать. Вы должны были бы синхронизироваться на B.this
, чтобы это работало.
public void run() {
synchronized (B.this) {
a.increment();
}
}
или любой другой уникальный объект, который одинаков для всех блоков синхронизации.
Или , если вы хотите использовать synchronized (this)
, тогда используйте один Runnable:
class B {
A a = new A();
Runnable r = new Runnable() {
public void run() {
synchronized (this) {
a.increment();
}
};
};
public void start() {
// t1.start();
// t2.start();
new Thread(r).start();
new Thread(r).start();
}
}