Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 函数中是否按类名同步在扩展类中是否有效?_Java_Synchronized - Fatal编程技术网

Java 函数中是否按类名同步在扩展类中是否有效?

Java 函数中是否按类名同步在扩展类中是否有效?,java,synchronized,Java,Synchronized,我在基类中有一个methodefoo使用Synchronized(类名),还有两个扩展基类的类a和B。如果我在两个不同的线程中从一个实例和一个实例调用foo,它们会被同步吗。下面是一个示例代码: class BaseClass { void foo() { synchronized(BaseClass.class) // do something like increment count } }

我在基类中有一个methodefoo使用Synchronized(类名),还有两个扩展基类的类a和B。如果我在两个不同的线程中从一个实例和一个实例调用foo,它们会被同步吗。下面是一个示例代码:

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() ;

是的,您正在同步同一个对象。

是的,这将在扩展
基类的所有类的所有实例上同步(包括
基类本身)。对于整个类加载器,
BaseClass.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
作为名称;为了清楚起见,我在这里更明确了。)

是的。它是同步的,即使不能保证线程执行的顺序