7中单例模式实现小结

import java.net.Socket;
import java.sql.Connection;

public class Test {
    public static void main(String[] args){

    }
}

/*
    第14章 7中单例设计模式的设计

    评估标准:线程安全、高性能、懒加载
 */

/*
    14.1 饿汉式
 */
final class Singleton1{
    private byte[] data = new byte[1024];

    private Singleton1(){}

    private static Singleton1 instance = new Singleton1();

    public static Singleton1  getInstance(){
        return instance;
    }
}

/*
    14.2 懒汉式
 */
final class Singleton2{
    private byte[] data = new byte[1024];

    private Singleton2(){}

    private static Singleton2 instance = null;

    public static Singleton2  getInstance(){
        if(instance==null){
            instance=new Singleton2();
        }
        return instance;
    }
}

/*
    14.3 懒汉式+同步方法

        性能低下
 */
final class Singleton3 {
    private byte[] data = new byte[1024];

    private Singleton3(){}

    private static Singleton3 instance = null;

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

/*
    14.4 Double-Check

    首次初始化时加锁,之后则允许多个线程同时进行getInstance方法的调用

    但是的但是,这种方案还是存在问题!!!
 */
final class Singleton4{
    private byte[] data = new byte[1024];

    private static Singleton4 instance = null;

    private Singleton4(){}

    public static Singleton4 getInstance(){
        if(null==instance){
            synchronized (Singleton4.class){
                if(null==instance){
                    /*
                        这个内部具体先初始化谁,我觉得一般人应该都
                        不知道吧,这个更像时一个答案,死记硬背的那
                        种。
                     */
                    instance=new Singleton4();
                }
            }
        }
        return instance;
    }
}

/*
    14.5 Volatile+Double-Check
 */

final class Singleton5{
    private byte[] data = new byte[1024];

    private volatile static Singleton5 instance = null;

    private Singleton5(){}

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

/*********************************************************************
    14.6 Holder方式

    在Singleton类中并灭有instance的静态成员,而是将器放到了静态内部类Holder之中
    因此在Singleton类的初始化过程中并不会创建Singleton的实例,Holder类中定义了
    Singleton的静态变量,并且直接进行了实例化。当Holder被主动引用时,则会创建
    Singleton的实例,Singleton实例的创建过程在Java程序编译使其收集至<clinit>()
    方法中,该方法又是同步方法,同步方法可以保证内存的可见性,JVM指令的顺序性和原子
    性。
 */
final class Singleton6{
    private byte[] data = new byte[1024];

    private Singleton6(){}

    private static class Holder{
        private static Singleton6 instance = new Singleton6();
    }
    
    public static Singleton6 getInstance(){
        return Holder.instance;
    }
}

/*

**********************************************************************/

/*
    14.7 枚举方式
    
        ——我对这部分不太熟练,暂时先不研究这部分吧
 */
enum Singleton7{
    INSTANCE;

    Singleton7(){
        System.out.println("INSTANCE will be initialized immediately");
    }
    
    public static void method(){
        
    }
    
    public static Singleton7 getInstance(){
        return INSTANCE;
    }
}

//改进后

enum Singleton7_1{
    INSTANCE;

    Singleton7_1(){
        System.out.println("INSTANCE will be initialized immediately");
    }

    public static void method(){

    }

    public static Singleton7_1 getInstance(){
        return INSTANCE;
    }
}

《Java高并发编程详解》笔记

猜你喜欢

转载自www.cnblogs.com/junjie2019/p/10603070.html