JAVA单例设计模式

  • 饿汉模式:线程安全,类初始化加载
  • 懒汉模式:懒汉式线程不安全,需要加上同步锁,同步锁影响了程序执行效率 饿汉式天生线程安全,类加载的时候初始化一次对象,效率比饿汉式高。同时volatile 禁止指令重排
  • 静态内部类的形式 :即实行了懒加载,线程安全,并且不需要加锁,代码非常优雅。
package com.sunnyshine.singleton;
import org.apache.log4j.PropertyConfigurator;
/**
 * 单例设计模式的一般定义:一个类中只允许有一个实例。实现思路:让类的构造方法私有化,同时提供一个静态方法去实例化这个类。
 * 懒汉式:在静态方法中初始化。时间换空间。(不推荐,时间很重要) 饿汉式:在声明对象就初始化。空间换时间。(推荐,空间不是问题)
 * 懒汉式线程不安全,需要加上同步锁,同步锁影响了程序执行效率 饿汉式天生线程安全,类加载的时候初始化一次对象,效率比饿汉式高。
 * @Title: SingletonObject.java
 * @Description: <功能详细描述>
 * @author sunshine
 * @date 2019年9月25日上午9:20:12
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SingletontonObject {
	private static final Logger logger=LoggerFactory.getLogger(SingletontonObject.class);
	/**
	 * 饿汉式:类加载的时候即进行初始化
	 */
	private static final SingletontonObject HUNGRY_MAN_INSTANCE=new SingletontonObject();
	/**
	 * @Title:SingletonObject
	 * @Description:<私有化构造器>
	 * @author: sunnyshine
	 * @date: 2019年9月25日 上午9:26:19
	 */
	private SingletontonObject() {}
	public static SingletontonObject getHungryManInstance() {
		logger.debug("Hungry man instance:{}","com.sunnyshine.Singleton.SingletontonObject.getHungryManInstance()");
		return HUNGRY_MAN_INSTANCE;
	}
	/**
	 * 懒汉式 双重校验锁保证线程安全,比较好的写法  volatile 禁止指令重排 主要由于new SingletonTon();
	 */
	private static volatile SingletontonObject slacker_man_instance=null;
	public static SingletontonObject getSlackerManInstance() {
		if(slacker_man_instance==null) {
			synchronized (SingletontonObject.class) {
				if(slacker_man_instance==null) {
					slacker_man_instance=new SingletontonObject();
				}
			}
		}
		logger.debug("getSlackerManInstance");
		return slacker_man_instance;
	}
	
	
	/**
	 * <较为标准的写法 --- 静态内部类写法>
	 * 是否 Lazy 初始化:是 
	 * 是否多线程安全:是
	 * @Title: SingletontonObject.java
	 * @Description: <功能详细描述>
	 * @author  sunnyshine
	 * @date 2019年9月25日上午9:44:45
	 * @see  [相关类/方法]
	 * @since  [产品/模块版本]
	 */
	private static class SingletontonHolder{
		private static final SingletontonObject INSTANCE=new SingletontonObject();
	}
    
	public static SingletontonObject instance() {
		logger.debug("private static inner class instance:{}","com.sunnyshine.Singleton.SingletontonObject.instance()");
		return SingletontonHolder.INSTANCE;
	}
	
	
	public void say(String str) {
		logger.info("singleton :{}",str);
	}
	

}

 

 

你可能感兴趣的:(java,常用设计模式)