如何在java中同步静态方法

Sum*_*Tea 8 java concurrency static multithreading synchronized

在Java中实现单例模式时,我想出了这个问题.即使下面列出的示例不是我的真实代码,但与原始代码非常相似.

public class ConnectionFactory{
    private static ConnectionFactory instance;

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

        return instance;
    }

    private ConnectionFactory(){
        // private constructor implementation
    }
}
Run Code Online (Sandbox Code Playgroud)

因为我不太确定静态同步方法的行为,所以我从谷歌得到了一些建议 - 在同一个类中没有(或尽可能少)多个静态同步方法.我想在实现静态同步方法时,会使用属于Class对象的锁,这样多个静态同步方法可能会降低系统的性能.

我对吗?或者JVM使用其他机制来实现静态同步方法?如果我必须在类中实现多个静态同步方法,那么最佳实践是什么?

谢谢你们!

亲切的问候!

Rom*_*man 7

最好的方法(尽可能减少代码中的更改)是这样做的:

public class ConnectionFactory{
    private static ConnectionFactory instance = new ConnectionFactory();

    public static ConnectionFactory getInstance(){
        return instance;
    }

    private ConnectionFactory(){
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,现在没有真正需要的getInstance方法,因此您可以将代码简化为:

public class ConnectionFactory{
    public static final ConnectionFactory INSTANCE = new ConnectionFactory();

    private ConnectionFactory(){
    }
}
Run Code Online (Sandbox Code Playgroud)

关于同步的UPD:最好的方法是在外部类不可见的锁上进行同步,即:

public class ConnectionFactory{
    private static final Object lock = new Object();

    public static void doSmth() {
        synchronized (lock) {

           ...
        }
    }

    public static void doSmthElse() {
        synchronized (lock) {

           ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

关于"为什么同步this是一个坏主意"(就像这个一样)有很多讨论,我认为在课堂上同步也是如此.