单例模式的5种实现方法-设计模式

weblog 856 0 0
1.双重检查的方式

 特点:线程安全;延迟加载;效率较高,推荐使用

/**
 * 	双重检查的方式,线程安全;延迟加载;效率较高。
 * @author LENOVO
 *
 */
public class Singleton {
    private static volatile Singleton singleton;
    private Singleton() {}

    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}
2.静态内部类

特点:延时加载,线程安全,效率高

/**
 * 	静态内部类的方式,延时加载,线程安全,效率高
 * @author LENOVO
 */
public class Singleton2 {
    private Singleton2() {}
    private static class SingletonInstance {
        private static final Singleton2 INSTANCE = new Singleton2();
        static {
        	System.out.println(INSTANCE);
        }
    }
    public static Singleton2 getInstance() {
    	System.out.println("****");
        return SingletonInstance.INSTANCE;
    }
    public static void main(String[] args) {
		Singleton2.getInstance();
		/**
		 * 	为什么说是延时加载呢?
		 * 	静态变量在类加载完成以后就完成了初始化,但在本例当中
		 * 	在没有调用getInstance方法之前,SingletonInstance类是不会被虚拟机加载的。
		 * 	当调用getInstance方法,执行return SingletonInstance.INSTANCE;语句时,
		 * 	虚拟机才会去加载SingletonInstance类,并完成INSTANCE实例的初始化。
		 */
	}
}
3.饿汉式(静态常量)
/**
 * 	饿汉式(静态常量),在类加载的时候完成初始化
 * @author LENOVO
 */
public class Singleton3 {
    private final static Singleton3 INSTANCE = new Singleton3();
    private Singleton3(){}
    public static Singleton3 getInstance(){
        return INSTANCE;
    }
}
4.懒汉式(延时加载【不推荐用】)
/**
 * 	懒汉式(延时加载【不推荐用】)
 * @author LENOVO
 *
 */
public class Singleton4 {

    private static Singleton4 Singleton4;

    private Singleton4() {}

    /**
     * 	线程不安全
     * @return
     */
    public static Singleton4 getInstance() {
        if (Singleton4 == null) {
            Singleton4 = new Singleton4();
        }
        return Singleton4;
    }
    
    /**
     * 	线程安全,但是效率底
     * @return
     */
    public static synchronized Singleton4 getInstance2() {
        if (Singleton4 == null) {
        	Singleton4 = new Singleton4();
        }
        return Singleton4;
    }
    
    /**
     * 	线程不安全效率底,这种方法不能起到线程同步的效果
     * @return
     */
    public static Singleton4 getInstance3() {
        if (Singleton4 == null) {
            synchronized (Singleton4.class) {
            	Singleton4 = new Singleton4();
            }
        }
        return Singleton4;
    }
}
5.枚举实现单例模式

 枚举的方式实现是最安全的

public enum Singleton5 {
    INSTANCE;
    public int i = 0;
    public void leaveTheBuilding() {
        i++;
        System.out.println("我现在是单例,这是我第"+i+"次调用!!");
    }
    // 调用这样子调用
    public static void main(String[] args) {
       for(int z = 0 ; z<10 ;z++){
    	   Singleton5  demo = Singleton5.INSTANCE;
           demo .leaveTheBuilding();
      }
    }
}

 


猜你喜欢
java基础 4393 java启动线程1.继承Thread类,重写run,调用start启动线程2.Runnable接口,重写run,调用start启动线程3.Callable接口代码如
redis 730 介绍  机版Redis存在性能瓶颈,Redis通过提高主从复制读写分离,提高了了Redis可用性,另一便也能数据在多个Redis直接备份。  通过配置Redis主从复制机制可以提
java基础 1295 java线程通讯之生产者消费者生产者消费者是并发、多线程编程中经典,生产者和消费者通过分离执行工作解耦,简化了开发,生产者和消费者可以以不同速度生产和消费数据。一个生产和消
official 799 上一篇文章《(mq)rabbitmq消息发送确认》介绍了消息发布时确认案,本篇文章将介绍,消息消费确认。和确认发布一样,消费者有时也需要确认,rabbitmq有三确认
official 859 一、什么是bio?bio即:同步阻塞IO。就是传统javaio网络型。javabio有两个阻塞,第一个地是需要阻塞监听端口,等待客户端链接。第二个需要阻塞Socketread
框架 3694 springaop操作日志记录此次对controller中执行情况进行记录,记录执行时间,操作人,请求路径,入参,块,功能等。并利用注解对被操作
数据结构与算法 1451 java使用欧几里得算算比 publicstaticvoidmain(String[]args){ System.out.println(bili(2,6
java虚拟机(jvm) 4497 jvm内存型分析(1)已经对内存型进行了一个宏观概括http://www.jiajiajia.club/weblog/blog/artical/82那么下边具体分析一下执行过程还是以一个
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。