package com.teng.practice1;
/**
* 成长积累1——单例
* 静态变量创建,简洁,但过早创建实例,降低内存使用效率
* @author TENG
*/
public class Singleton1 {
private Singleton1(){};
private static Singleton1 instance = new Singleton1();
public static Singleton1 getInstance(){
return instance;
}
}
package com.teng.practice1;
/**
* 单例
* 调用时再创建,双重判空,加锁解决多线程问题
* @author TENG
*/
public class Singleton2 {
private Singleton2(){};
private static Singleton2 instance = null;
private static Object synObj = new Object();
/**
* 加锁,保证在多线程环境也可用
* 只有当instance为null,需要加锁。当instance不为空,不需要加锁。
* 因为加锁是一个非常耗时的操作
* @return
*/
public static Singleton2 getSingleton(){
if(instance == null) {
synchronized (synObj) {
if (instance == null) {
instance = new Singleton2();
}
}
}
return instance;
}
}
package com.teng.practice1;
/**
* 单例,使用静态内部,保证按需创建,不提前占用内存
* @author TENG
*/
public class Singleton3 {
private Singleton3(){};
public static Singleton3 getInstance(){
return Singleton.instance;
}
static class Singleton{
private Singleton(){};
private static Singleton3 instance = new Singleton3();
}
}
package com.example.algorithm.singleton;
/**
* 线程安全的懒汉式:枚举
*/
public enum Singleton {
INSTANCE;
public void method(){
//do something
}
}