Java 同步与静态同步

Java 同步与静态同步,java,synchronized,Java,Synchronized,我试图理解同步和静态同步方法之间的主要区别 例如,考虑一个Employee类,它有几个实例e1,e2 synchronized method1() { //--- blah blah--- } 当e1通过获取对象级锁来执行method1()时,e2将等待被e1解除的锁 在静态同步的情况下,e1在类级别持有锁时,e2不能进入该块 static synchronized method1() { //--- blah blah--- } 这两种情况有何不同?我看不出静态和非静态同步

我试图理解同步和静态同步方法之间的主要区别

例如,考虑一个
Employee
类,它有几个实例
e1
e2

synchronized method1() {
    //--- blah blah---
}
e1
通过获取对象级锁来执行
method1()
时,
e2
将等待被
e1
解除的锁

在静态同步的情况下,
e1
在类级别持有锁时,
e2
不能进入该块

static synchronized method1() {
    //--- blah blah---
}

这两种情况有何不同?我看不出静态和非静态同步方法访问之间有任何区别。

在您的第一个示例中,同步是在实例级别操作的,因此如果您同时调用
e1.method1()
e2.method1()
,则允许它们并行运行


在第二个示例中,同步是在类级别操作的,因此如果同时调用
e1.method1()
e2.method1()
,它们将不会并行运行。

在第一个示例中,您确定e1和e2可以并行运行吗?它是否与同步的概念相矛盾?@Balagig我确定:是/它是否矛盾:否。第一个示例相当于
void method1(){synchronized(this){…}
。因此,如果运行
e1.method1();e2.method1()
它们将分别锁定
e1
e2
。因为它们是不同的锁,所以它们不是互斥的。第二个示例相当于
静态void method1(){synchronized(MyClass.class){…}}
——在这种情况下,所有实例的锁都是相同的(
MyClass.class
),所有调用都是互斥的。