Java单例模式

//饿汉式,线程安全
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(){

  }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值