单例模式的几种实现方法以及各自的优缺点对比分析
package cn.guyouda.designpattern.singleton;
/**
* 单例模式的多种实现
* 各种实现的优缺点对比
* 线程安全的考虑
* @author Youda
*
*/
public class SingletonTest {
public static void main(String[] args) {
Singleton1 singleton1 = Singleton1.getInstance();
Singleton2 singleton2 = Singleton2.getInstance();
Singleton3 singleton3 = Singleton3.getInstance();
Singleton4 singleton4 = Singleton4.getInstance();
}
}
/**
* 第一种单例模式
* 优点:最简单的一种单例模式,同时也是线程安全的
* 缺点:只是对象在还未使用就已经创建了
* @author Youda
*
*/
class Singleton1{
private static Singleton1 singleton= new Singleton1();
private Singleton1(){}
public static Singleton1 getInstance(){
return singleton;
}
}
/**
* 第二种单例模式
* 优点:避免了没有使用的情况下就已经创建对象
* 缺点:线程不安全,假如两个线程都同时执行到判断了singleton==null
* 然后就会导致创建两个对象
*
* @author Youda
*
*/
class Singleton2{
private static Singleton2 singleton;
private Singleton2(){}
public static Singleton2 getInstance(){
if(singleton == null){
singleton = new Singleton2();
}
return singleton;
}
}
/**
* 第三种单例模式
* 优点:在第二种基础上改进,保证了线程安全
* 缺点:每次都会执行同步代码块,效率极低
*
* @author Youda
*
*/
class Singleton3{
private static Singleton3 singleton;
private Singleton3(){}
public static synchronized Singleton3 getInstance(){
if(singleton == null){
singleton = new Singleton3();
}
return singleton;
}
}
/**
* 第四种单例模式
* 即保证了线程安全,也解决了第三种方式的效率低下
*
* @author Youda
*
*/
class Singleton4{
private volatile static Singleton4 singleton;
private Singleton4(){}
public static Singleton4 getInstance(){
if(singleton == null){
synchronized (Singleton4.class) {
singleton = new Singleton4();
}
}
return singleton;
}
}