在抽象类中同步静态方法

时间:2017-09-18 05:16:21

标签: java multithreading singleton

鉴于我有单身类

        abstract class Foo {
           private static Foo instance;

           public static synchronized Foo getInstance() {
            if(instance == null) {
               instance = new FooImpl(); 
            }

            return instance;
           }
        }

这个方法是否锁定了Class对象?抽象类甚至有Class对象吗?

2 个答案:

答案 0 :(得分:3)

如果您的getInstance方法是代码中的非静态方法,则需要在Foo的实例上调用它,该实例将是非抽象子类,并且是监视器对象的synchronized方法就是那个实例。

如果你使它synchronized,它将锁定抽象类的类对象。

您可以在Java language specification 17.1

中找到详细信息

答案 1 :(得分:1)

这个方法是否锁定了Class对象? - >是的它锁定了类对象

抽象类甚至有Class对象吗? - >

在Java中,每个对象都有锁定。

我们在java中有两种类型的锁定机制-1)对象级别锁定和2)类级别锁定。

如果synchronized方法是静态的,则会有类级别锁定,如果synchronized方法是非静态的,那么它将是对象级锁定。

因此,根据您的代码,方法getInstance()会锁定Foo.class对象,尽管它是否声明了抽象。