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
),所有调用都是互斥的。