持有监视器的java线程

nwo49xxi  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(368)

我正在读关于java线程的文章,碰巧读了这个博客。在博客里我看到了一个声明:
在同步方法执行期间,线程持有该方法对象的监视器,或者如果该方法是静态的,则持有该方法类的监视器。
谁能告诉我这两者之间的区别是什么
一个线程正在保存方法对象的监视器
一个线程正在保存方法类的监视器

0s7z1bwu

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节。

pvcm50d1

pvcm50d12#

你可以在课堂上鲁莽地翻译 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 对象是单例的,这就是它工作的原因)。

6qfn3psc

6qfn3psc3#

在非静态方法中,锁在示例上(this);即你的方法相当于:

public void method(){
    synchronised(this){
        //my code
    }
}

在静态方法上,没有示例(不能在静态方法中引用)。所以锁在实际的类对象(myobject.class)上。

public static void method(){
    synchronised(MyClass.class){
        //my code
    }
}

因此,使用1个同步方法和1个同步静态方法,这两个方法可以同时执行,因为没有什么可以阻止它们并行运行,锁在不同的对象上。

相关问题