Различия между использованием synchronized (obj) и объявленной блокировки - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь синхронизировать этот метод 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, а затем снять блокировку и позволить второму потоку войти в метод?

1 Ответ

0 голосов
/ 12 января 2019

Использование

public synchronized void run() {

- это короткая рука для

public void run() {
    synchronized (this) {

Поскольку this отличается для каждого объекта с блокировкой, они не зависят друг от друга. Другими словами, это ничего не делает в вашем случае.

...