Синхронизация в многопоточности - PullRequest
0 голосов
/ 08 мая 2018

Я новичок в многопоточности и столкнулся с этой концепцией:

2 метода m1 не статически синхронизированы, а m2 статически синхронизированы и 2 потока T1 обращаются к m1 с объектом o1 и T2 обращаются к m2может выполняться одновременно, так как m1 и m2 синхронизируются на 2 разных объектах.

Тогда почему в приведенном ниже примере потоки не могут получить доступ к методу одновременно, даже если объекты отличаются как Foo.class и f1и f2?

class Foo implements Runnable{
    void run()
        synchronised(Foo.class)
        { 
         ....

        }
    }
}
class Test{
    psvm(){

        Foo f1 = new Foo();
        Foo f2 = new Foo();
        Thread t1 = new Thread(f1);
        Thread t2 = new Thread(f2);
        t1.start();
        t2.start(); 
    }
}

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

В вашем коде синхронизация выполнена как блокировка уровня класса .

Когда один поток обращается к нему, другой поток ожидает своего хода.

Синхронизация используется, когда вы хотите ограничить параллелизм, чтобы у всех потоков был свой ход для доступа к ресурсу

0 голосов
/ 09 мая 2018

2 метода: m1 - не статическая синхронизация, а m2 - статическая синхронизированы и 2 потока T1 обращаются к m1 с объектом o1 и T2 доступ к m2 может выполняться одновременно, так как m1 и m2 синхронизируются на 2 разных объекта.

нестатический метод m1 синхронизирован на this (текущий экземпляр), статический метод m2 синхронизирован на this.getClass() (которому принадлежит текущий экземпляр объекта класса). Они синхронизируются на различных объектах , поэтому они не могут блокировать друг друга.

В размещенном коде синхронизированный блок имеет явную блокировку монитора Foo.class, разные экземпляры Foo совместно используют один и тот же Foo.class, что означает, что код синхронизируется на том же объекте . Таким образом, только один поток может войти в синхронизированный блок, другие будут заблокированы, пока он не будет существовать.

...