package com.kaka.test;
/**
** 单例使用场景 需要频繁的进行创建和销毁的对象;
*
**创建对象时耗时过多或耗费资源过多,但又经常用到的对象;
*
**工具类对象频繁访问数据库或文件的对象。
*
* @author KAKA
*
*/
public class Singleton {
// 饿汉式(常量类)
private final static Singleton INSTANCE = new Singleton();
private Singleton() {
}
public static Singleton getSingleton() {
//类装载的时候就完成实例化避免了线程同步问题
return INSTANCE;
}
public static void main(String[] args) {
getSingleton();
}
// 饿汉式(静态常量)
private static Singleton instance;
static {
instance = new Singleton();
}
// private Singleton(){}
public static Singleton getinstance() {
return instance;
}
// 懒汉式(静态代码块)
private static Singleton instance1;
static {
instance1 = new Singleton();
}
// private Singleton() {}
public static Singleton getInstance1() {
return instance1;
}
// 懒汉式(线程不安全)
private static Singleton singleton2;
// private Singleton() {}
public static Singleton getsingleton2() {
if (singleton2 == null) {
singleton2 = new Singleton();
}
return singleton2;
}
// 懒汉式(线程安全,同步方法)
private static Singleton singleton04;
// private Singleton() {}
public static synchronized Singleton getInstance() {
if (singleton04 == null) {
singleton04 = new Singleton();
}
return singleton04;
}
// 懒汉式(线程安全,同步代码块) 特点:效率低
private static Singleton instance05;
// private Singleton() {}
public static Singleton getInstance05() {
if (instance05 == null) {
synchronized (Singleton.class) {
instance05 = new Singleton();
}
}
return instance05;
}
// 第6种 双重检查(推荐使用)
private static volatile Singleton singleton06;
// private Singleton() {}
public static Singleton getSingleton06() {
if (singleton06 == null) { // 第一次校验线程
synchronized (Singleton.class) {
if (singleton06 == null) { // 第二次校验线程
singleton06 = new Singleton();
}
}
}
// 线程安全,延迟加载,效率高
return singleton06;
}
// 静态内部类(推荐使用)
// private Singleton() {}
@SuppressWarnings("unused")
private static class SingletonInstance {
private static final Singleton INSTANCE07 = new Singleton();
public static Singleton getInstance07() {
// Singleton类被装载时并不会立即实例化,而是在需要实例化时,
// 调用getInstance方法,才会装载SingletonInstance类,从而完成Singleton的实例化
return SingletonInstance.INSTANCE07;
}
// 枚举型(推荐使用) jdk1.5
// 优势:避免多线程同步,还可以防止反序列化创建的新对象
@SuppressWarnings("unused")
public enum Singleton07 {
INSTANCE07;
public void getInstanceMethod() {
}
}
}
}