单例模式
1.什么是单例模式
通俗讲:在创建对象时,有且只有一个对象,给所有对象提供这一实例对象。
2.如何实现单例模式
首先将构造方法私有化,提供一个对外的静态方法,静态方法则包含单例类的对象。单例模式分为懒汉和饿汉。
public class Single{
private Single(){}
private static Single single=new Single();
public static Single getInstance(){
return single;
}
}
//简单手撸
以上表示饿汉模式-此模式的线程是安全的,但它一直消耗了内存,因为在加载这个单例类时就已经创建了单列类的对象,此模式也符合我们实现单例模式的要求。
public class Single{
private Single(){}
private static Single single=null;
public static Single getInstance(){
if(sinle==null){//假设线程1执行到这时,
//cpu的资源给了线程2,两个线程都进了if
//所以这个单例对象就不是唯一的
single=new Single();
}
return single;
}
}
以上表示懒汉模式:当你需要使用的时候才创建,线程不安全。
如何改进懒汉模式线程的不安全?
1.加同步锁synchronized
直接在单例类提供的静态方法上加synchronized
2.优雅的方式(双重检查加锁)
public class Single{
private Single(){}
private static Single single=null;
public static Single getInstance(){
if(sinle==null){
synchronized(Single.class){
if(sinle==null){
single=new Single();
}
}
return single;
}
}
此方法不仅保证了对象的唯一性而且还提升获取对象的效率,即创建对象时上锁,一旦对象创建完毕后,获取对象就不会触发上锁的代码。