package singleton;
//懒汉式线程不安全
public class Singleton {
private static Singleton singleton;
private Singleton() {
}
public static Singleton getInstance(){
if (singleton==null) {
singleton=new Singleton();
}
return singleton;
}
}
//懒汉式线程安全 效率不高因为在任何时候只能有一个线程调用getInstance()方法
class Singleton1 {
private static Singleton1 singleton1;
private Singleton1() {
}
public synchronized static Singleton1 getInstance(){
if (singleton1==null) {
singleton1=new Singleton1();
}
return singleton1;
}
}
//双重检验锁
class Singleton2 {
//volatile禁止指令重排序优化
private static volatile Singleton2 singleton2;
private Singleton2() {
}
public static Singleton2 getInstance(){
if (singleton2==null) {//一次检查
synchronized (Singleton.class) {
if (singleton2==null) {//二次检查
singleton2=new Singleton2();
}
}
}
return singleton2;
}
}
//饿汉式static final
class Singleton3 {
//类加载时即被初始化所有创建本身是实例安全的
private static final Singleton3 singleton3=new Singleton3();
private Singleton3() {
}
public static Singleton3 getInstance(){
return singleton3;
}
}
//静态内部类的形式 推荐
class Singleton4 {
//类加载时即被初始化所有创建本身是实例安全的
private static class SingletonHolder{
private static final Singleton4 SINGLETON4=new Singleton4();
}
private Singleton4() {
}
public static Singleton4 getInstance(){
return SingletonHolder.SINGLETON4;//由于是私有静态内部类所以是懒汉式的加载
}
}
//枚举创建线程默认是线程安全的防止反序列化导致的重新创建对象
enum Singleton5{
INSTANCE;
//懒汉式线程不安全
public class Singleton {
private static Singleton singleton;
private Singleton() {
}
public static Singleton getInstance(){
if (singleton==null) {
singleton=new Singleton();
}
return singleton;
}
}
//懒汉式线程安全 效率不高因为在任何时候只能有一个线程调用getInstance()方法
class Singleton1 {
private static Singleton1 singleton1;
private Singleton1() {
}
public synchronized static Singleton1 getInstance(){
if (singleton1==null) {
singleton1=new Singleton1();
}
return singleton1;
}
}
//双重检验锁
class Singleton2 {
//volatile禁止指令重排序优化
private static volatile Singleton2 singleton2;
private Singleton2() {
}
public static Singleton2 getInstance(){
if (singleton2==null) {//一次检查
synchronized (Singleton.class) {
if (singleton2==null) {//二次检查
singleton2=new Singleton2();
}
}
}
return singleton2;
}
}
//饿汉式static final
class Singleton3 {
//类加载时即被初始化所有创建本身是实例安全的
private static final Singleton3 singleton3=new Singleton3();
private Singleton3() {
}
public static Singleton3 getInstance(){
return singleton3;
}
}
//静态内部类的形式 推荐
class Singleton4 {
//类加载时即被初始化所有创建本身是实例安全的
private static class SingletonHolder{
private static final Singleton4 SINGLETON4=new Singleton4();
}
private Singleton4() {
}
public static Singleton4 getInstance(){
return SingletonHolder.SINGLETON4;//由于是私有静态内部类所以是懒汉式的加载
}
}
//枚举创建线程默认是线程安全的防止反序列化导致的重新创建对象
enum Singleton5{
INSTANCE;
}
参考文章http://wuchong.me/blog/2014/08/28/how-to-correctly-write-singleton-pattern/