//饿汉式,线程安全
class Singleton1{
private Singleton1()
{
}
private static Singleton s = new Singleton();
public static Singleton getInstance(){
return s;
}
}
//懒汉式,多线程可能创建多个实例
class Singleton2{
private Singleton2()
{
}
private static Singleton2 s = null;
public static Singleton2 getInstance()
{
if(s==null)
{
s= new Singleton2();
}
return s;
}
}
//加上同步锁的懒汉式,但是多线程情况下效率不高
class Singleton3
{
private Singleton3()
{
}
private static Singleton3 s;
Object obj = new Object();
public static Singleton3 getInstance()
{
synchronized(obj)
{
if(s==null)
{
s= new Singleton2();
}
}
return s;
}
}
//同步锁加双重校验,提高效率
//第一重判断是为了提高效率,当实例已经存在时,不需要经过同步锁
//第二重判断是为了防止多次创建实例,同Singleton3 推荐
class Singleton4
{
private Singleton4()
{
}
private static Singleton4 s = null;
public static Singleton4 getInstance()
{
if(s==null)
{
synchronized(Singleton4.class)
{
if(s==null)
{
s= new Singleton4();
}
}
}
return s;
}
}
//使用静态内部类 推荐
//第一. 内部静态类是要在有引用了以后才会装载到内存的,
// 静态内部类中的静态成员只在第一次使用的时候加载
//第二. 在多线程环境下,jvm对一个类的初始化会做限制,同一时间只会
//允许一个线程去初始化一个类,这样就从虚拟机层面避免了大部分单例实现的问题
class Singleton5{
private Sington5(){}
private static class innerClass{
private static Singleton5 s = new Singleton5();
}
public static Singleton5 getInstance()
{
return innerClass.s;
}
class Singleton1{
private Singleton1()
{
}
private static Singleton s = new Singleton();
public static Singleton getInstance(){
return s;
}
}
//懒汉式,多线程可能创建多个实例
class Singleton2{
private Singleton2()
{
}
private static Singleton2 s = null;
public static Singleton2 getInstance()
{
if(s==null)
{
s= new Singleton2();
}
return s;
}
}
//加上同步锁的懒汉式,但是多线程情况下效率不高
class Singleton3
{
private Singleton3()
{
}
private static Singleton3 s;
Object obj = new Object();
public static Singleton3 getInstance()
{
synchronized(obj)
{
if(s==null)
{
s= new Singleton2();
}
}
return s;
}
}
//同步锁加双重校验,提高效率
//第一重判断是为了提高效率,当实例已经存在时,不需要经过同步锁
//第二重判断是为了防止多次创建实例,同Singleton3 推荐
class Singleton4
{
private Singleton4()
{
}
private static Singleton4 s = null;
public static Singleton4 getInstance()
{
if(s==null)
{
synchronized(Singleton4.class)
{
if(s==null)
{
s= new Singleton4();
}
}
}
return s;
}
}
//使用静态内部类 推荐
//第一. 内部静态类是要在有引用了以后才会装载到内存的,
// 静态内部类中的静态成员只在第一次使用的时候加载
//第二. 在多线程环境下,jvm对一个类的初始化会做限制,同一时间只会
//允许一个线程去初始化一个类,这样就从虚拟机层面避免了大部分单例实现的问题
class Singleton5{
private Sington5(){}
private static class innerClass{
private static Singleton5 s = new Singleton5();
}
public static Singleton5 getInstance()
{
return innerClass.s;
}
}
//使用枚举类,枚举类是指某个类的对象只有有限个可以穷举,当只有一个时,那就是单例
enum Singleton6{
INSTANCE; // 对象必须在成员前面,默认是public static final
public void method1(){
}
}