синхронизируется по имени класса в функции будет действительным для расширенных классов? - PullRequest
2 голосов
/ 20 января 2012

У меня есть метод foo в базовом классе, использует Synchronized (имя класса) и два класса A и B, которые расширяют базовый класс. если бы я вызвал foo из экземпляра A и экземпляра B в двух разных потоках, они будут синхронизированы. Вот пример кода:

class BaseClass { 
        void foo() {
        synchronized(BaseClass.class)   
            // do something like increment count 
        }   
    }


    class A extends BaseClass {
    }


    class B extends BaseClass {
    }

    A a = new A(); 
    B b = new B();
    //in thread 1
    a.foo() ; 
    //in thread 2
    b.foo() ;

Ответы [ 3 ]

5 голосов
/ 20 января 2012

Да, это будет синхронизировано между всеми экземплярами всех классов, расширяющих BaseClass (включая сам BaseClass).Ссылка BaseClass.class в основном будет единственной ссылкой для всего загрузчика классов.Вы действительно этого хотите?

Обычно , когда требуется синхронизация, статические методы должны синхронизироваться с чем-то статическим, а методы экземпляра должны синхронизироваться с чем-то связанным с экземпляром.Лично мне не нравится синхронизация либо по ссылке this, либо по ссылке Class, поскольку обе эти ссылки доступны в другом месте, поэтому другой код может синхронизироваться на том же мониторе, что затрудняет рассуждение о синхронизации.Вместо этого я хотел бы иметь:

public class Foo {
    private final Object instanceLock = new Object();

    public void doSomething() {
        synchronized (instanceLock) {
            // Stuff
        }
    }
}

public class Bar {
    private static final Object staticLock = new Object();

    public static void doSomething() {
        synchronized (staticLock) {
            // Stuff
        }
    }
}

(я обычно просто использую lock в качестве имени; я только что сделал это более ясным здесь для ясности.)

2 голосов
/ 20 января 2012

Да, вы синхронизируете одно и то же.

0 голосов
/ 20 января 2012

Да.Он синхронизируется, хотя последовательность выполнения потоков не гарантируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...