只实例化一个对象
懒汉式:
/**
* 单列模式-懒汉式
* @author luozheng
*
*/
public class Singleton1 {
//定义私有构造方法
private Singleton1(){
}
//方法加载时先实例化一个对象
private static Singleton1 singleton1 = null;
//提供一个全局public方法来访问对象
public static Singleton1 getInstace(){
//双重锁定,防止多线程每次取对象都需要等待上个线程的锁释放问题,会影响效率
if(singleton1!=null){
//对方法加锁,解决多线程实例多个对象问题,等同于synchronized public static Singleton1 getInstance()
synchronized (Singleton1.class) {
if(singleton1!=null){
singleton1=new Singleton1();
}
}
}
return singleton1;
}
}
饿汉式:
/**
* 单列模式-饿汉式
* @author luozheng
*
*/
public class Singleton2 {
//定义一个私有构造函数
private Singleton2(){
}
//方法加载前先实例化对象
private static Singleton2 singleton2 = new Singleton2();
//提供一个public方法访问对象
public static Singleton2 getInstance(){
return singleton2;
}
}
不考虑通过反射机制实例化对象
另外还可以通过静态内部类和静态代码块实现单列,不过这种方法在遇到对象序列化时,默认是多列的
public class Singleton3 {
// 私有构造
private Singleton3() {}
// 静态内部类
private static class InnerObject{
private static Singleton3 single = new Singleton3();
}
public static Singleton3 getInstance() {
return InnerObject.single;
}
}