Я пытаюсь синхронизировать этот метод run (). Мне бы хотелось, чтобы в него входил только один поток, но я не понимаю, почему решение говорит мне использовать метод synchronized (obj) :
public Tabellina(Contatore o, int num) {
obj = o;
numero = num;
r = new Random();
start();
}
public void run() {
synchronized(obj) {
for (int j=0; j<10; j++) {
obj.incr();
try {
Thread.sleep(100);
} catch (InterruptedException e) { }
System.out.println(Thread.currentThread().getName() + ": " + obj.getVal());
}
try {
Thread.sleep(r.nextInt(2000));
} catch (InterruptedException e) { }
}}
}
Моя идея состояла в том, чтобы создать блокировку и синхронизировать ее следующим образом:
public Tabellina(Contatore o, int num) {
obj = o;
numero = num;
r = new Random();
l1 = new ReentrantLock();
start();
}
public synchronized void run() {
l1.lock();
for (int j=0; j<10; j++) {
obj.incr();
try {
Thread.sleep(100);
} catch (InterruptedException e) { }
System.out.println(Thread.currentThread().getName() + ": " + obj.getVal());
}
try {
Thread.sleep(r.nextInt(2000));
} catch (InterruptedException e) { }
l1.unlock();
}
}
Но это не работает, потому что потоки печатают содержимое for поочередно. Как это возможно? Если я использую lock () в начале метода run, не должен ли первый поток завершить for, а затем снять блокировку и позволить второму потоку войти в метод?