No1Worker / Q-A

0 stars 0 forks source link

介绍一下单例模式? #4

Open zhiyongyu opened 4 years ago

zhiyongyu commented 4 years ago

单例的实现有 1、懒汉式 2、饿汉式 3、静态内部类(其实也算懒汉式的一种)。 最主要就是这三种

zhiyongyu commented 4 years ago

饿汉式实现:

public class Test {
    public static Test test = new Test();

    public static Test getInstance(){
        return test;
    }
}

静态变量new 出实体。在类被初始化的时候就已经创建了。线程安全,但是如果没被使用到的时候,有点浪费资源。

zhiyongyu commented 4 years ago

懒汉式实现: 第一种(线程不安全)

public class Test {
    private static Test test;

    public static Test getInstance(){
        if(test == null){
            test = new Test();
        }
        return test;
    }
}

调用方法的时候new 出实体。线程不安全。

第二种(使用同步锁,线程安全)

public class Test {
    private static Test test;

    public static synchronized Test getInstance(){
        if(test == null){
            test = new Test();
        }
        return test;
    }
}

使用同步锁。在调用方法上使用同步锁,导致每次调用都会校验,影响性能。

第三种(双重锁,线程安全)

public class Test {
    private static volatile Test test;

    public static Test getInstance(){
        if(test == null){
            synchronized (Test.class){
                if(test == null){
                    test = new Test();
                }
            }
        }
        return test;
    }
}

双重锁会先判断一下对象是否存在,不存在对象再使用同步锁,就不用每次调用都去校验了。

zhiyongyu commented 4 years ago

静态内部类实现:

public class Test {
    private static class TestHolder{
        private static Test test = new Test();
    }

    public static Test getInstance(){
        return TestHolder.test;
    }
}

和饿汉式写法很像,只不过是在静态内部类的静态变量中new 出实体。线程安全。在调用方法的时候才会由内部类去创建对象,不浪费资源。