Предположим, что я создаю 2 потока CounterRunnable и создаю один объект Mycounter.
Как в приведенном ниже коде работает синхронизация? Я представил, что когда я синхронизируюсь со счетчиком, который является объектом, определенным в классе потока, у меня теперь есть 2 отдельных объекта с двумя разными объектами-счетчиками с двумя разными блокировками для каждого объекта.
Я думал, что теперь я блокирую сам объект счетчика, а не единственный объект, на который ссылаются.
public class example {
class CounterRunnable implements Runnable {
private MyCounter counter;
public CounterRunnable (MyCounter counter) {
this.counter = counter;
}
public void run () {
for (int i = 0 ; i < 1000; i++)
synchronized(this.counter){
counter.increment();
}
}
}
class MyCounter {
private int c =0;
public synchronized void increment () {
c++;
}
public int value () {return c;}
}
public static void main (String [] args) throws InterruptedException {
example ex = new example();
MyCounter counter = ex.new MyCounter();
Thread t1 = new Thread (ex.new CounterRunnable(counter));
Thread t2 = new Thread (ex.new CounterRunnable(counter));
t1.start(); t2.start();
t1.join(); t2.join();
System.out.println(counter.value());
}
}