我正在读关于java线程的文章,碰巧读了这个博客。在博客里我看到了一个声明:在同步方法执行期间,线程持有该方法对象的监视器,或者如果该方法是静态的,则持有该方法类的监视器。谁能告诉我这两者之间的区别是什么一个线程正在保存方法对象的监视器一个线程正在保存方法类的监视器
0s7z1bwu1#
这意味着同步示例方法大致相当于:
public class FooClass { public void foo() { synchronized(this) { ... } } }
而同步静态方法大致相当于:
public class FooClass { public static void foo() { synchronized(FooClass.class) { ... } } }
因此,在instance方法的情况下,它将在的示例上同步 FooClass (并致电 foo 在其他示例上的其他线程将不会阻塞),而在静态方法的情况下,它将在 Class 对象本身。请注意,对于静态方法版本,包含方法的类是重要的-即使方法在概念上被称为“on”子类(例如。 SubFooClass.foo() )该方法仍然在声明它的类上获取监视器。详见jls第8.4.3.6节。
FooClass
foo
Class
SubFooClass.foo()
pvcm50d12#
你可以在课堂上鲁莽地翻译 Foo ,说:
Foo
public synchronized foo() { doSomething(); }
收件人:
public foo() { synchronized(this) { doSomething(); } }
鉴于:
public static synchronized foo() { doSomething(); }
大致翻译为:
public static foo() { synchronized(Foo.class) { doSomething(); } }
在第一种情况下,您将针对的当前示例进行同步 Foo ( this ). 在第二种情况下,您可以与 Class 对象(全部) Class 对象是单例的,这就是它工作的原因)。
this
6qfn3psc3#
在非静态方法中,锁在示例上(this);即你的方法相当于:
public void method(){ synchronised(this){ //my code } }
在静态方法上,没有示例(不能在静态方法中引用)。所以锁在实际的类对象(myobject.class)上。
public static void method(){ synchronised(MyClass.class){ //my code } }
因此,使用1个同步方法和1个同步静态方法,这两个方法可以同时执行,因为没有什么可以阻止它们并行运行,锁在不同的对象上。
3条答案
按热度按时间0s7z1bwu1#
这意味着同步示例方法大致相当于:
而同步静态方法大致相当于:
因此,在instance方法的情况下,它将在的示例上同步
FooClass
(并致电foo
在其他示例上的其他线程将不会阻塞),而在静态方法的情况下,它将在Class
对象本身。请注意,对于静态方法版本,包含方法的类是重要的-即使方法在概念上被称为“on”子类(例如。
SubFooClass.foo()
)该方法仍然在声明它的类上获取监视器。详见jls第8.4.3.6节。
pvcm50d12#
你可以在课堂上鲁莽地翻译
Foo
,说:收件人:
鉴于:
大致翻译为:
在第一种情况下,您将针对的当前示例进行同步
Foo
(this
). 在第二种情况下,您可以与Class
对象(全部)Class
对象是单例的,这就是它工作的原因)。6qfn3psc3#
在非静态方法中,锁在示例上(this);即你的方法相当于:
在静态方法上,没有示例(不能在静态方法中引用)。所以锁在实际的类对象(myobject.class)上。
因此,使用1个同步方法和1个同步静态方法,这两个方法可以同时执行,因为没有什么可以阻止它们并行运行,锁在不同的对象上。