java之单例模式:饿汉式、懒汉式、双重校验锁、枚举、静态内部类

一、饿汉式:

/**
* 饿汉式:
* 不存在多线程同步问题,当类被加载时,初始化并分配内存空间;
* 当类被卸载时,才释放所占内存,因此在某些特定条件下会耗费内存。
*
* @author:  Rodge
* @time:    2018年10月4日 下午4:35:12
* @version: V1.0.0
*/
public class SingletonTest {
	
	// 定义一个私有构造,防止通过new去实例化
	private SingletonTest() {
		
	}
	// 将自身实例对象设置为一个属性
	private static final SingletonTest singleton = new SingletonTest();
	// 静态方法返回该类实例
	public static SingletonTest getSingleton() {
		return singleton;
	}
}

二、懒汉式:

/**
* 懒汉式
*
* @author:  Rodge
* @time:    2018年10月4日 下午4:40:43
* @version: V1.0.0
*/
public class SingletonTest {
	
	// 定义一个私有构造,防止通过new去实例化
	private SingletonTest() {
		
	}
	// 定义一个类型的变量(不初始化,不使用final关键字)
	private static SingletonTest singleton;
	// 定义一个静态的方法(调用时再初始化,但是多线程访问时,可能造成重复初始化问题)
	public static SingletonTest getSingleton() {
		if(singleton == null) {
			singleton = new SingletonTest();
		}
		return singleton;
	}
}

三、双重校验锁:

/**
* 懒汉式最优方案:线程安全,效率高(双重校验锁)
*
* @author:  Rodge
* @time:    2018年10月4日 下午4:44:32
* @version: V1.0.0
*/
public class SingletonTest {
	
	// 定义一个私有构造,防止通过new去实例化
	private SingletonTest() {
		
	}
	// 使用volatile保证了多线程访问时singleton变量的可见性,
        // 避免了初始化时其他变量属性还没赋值完时,被另外线程调用
	private static volatile SingletonTest singleton;
	// 定义一个静态的方法(调用时再初始化,但是多线程访问时,可能造成重复初始化问题)
	public static SingletonTest getSingleton() {
		// 先判断,不使用同步代码块,singleton不等于null时,直接返回对象,提高运行效率
		if(singleton == null) {
			// 同步代码块(对象未初始化时,使用同步代码块,保证多线程访问时对象在第一次创建后,
                        // 不再重复被创建)
			synchronized (SingletonTest.class) {
				// 未初始化,则初始singleton变量
				if(singleton == null) {
					singleton = new SingletonTest();
				}
			}
		}
		return singleton;
	}
}

四、枚举:

/**
* 枚举
*
* @author:  Rodge
* @time:    2018年10月4日 下午4:47:56
* @version: V1.0.0
*/
public enum SingletonTest {  
    INSTANCE;  
    public void get() {
        System.out.println("init...");
    }  
}

public static void main(String[] args) {
    SingletonTest s = SingletonTest.INSTANCE;
    s.get();
}

五、静态内部类:

/**
* 静态内部类
*
* @author:  Rodge
* @time:    2018年10月4日 下午4:50:28
* @version: V1.0.0
*/
public class SingletonTest {
	
	// 定义一个私有构造,防止通过new去实例化
	private SingletonTest() {
		
	}
        // 定义静态内部类
	private static class Singleton2 {  
	    private static final SingletonTest singleton = new SingletonTest();  
	}
        public static final SingletonTest get() {  
	    return Singleton2.singleton;  
	}
}

 

你可能感兴趣的:(个人笔记)