欢迎各位大牛指教

单例简介

单例有三种分别是:懒汉式,饿汉式,登记式
单例特点:1,单例只能有一个实例  2,单例类必须自己创建自己的实例  3,单例类必须给所有其他对象提供这一实例
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例
详解懒汉式:第一次调用时实例化自己
public class Singleton{
private Singleton(){
}
private static Singleton single=null;
静态工厂方法
public static Singleton getInstance(){
if(single==null){
single=new Singleton();
}
return single;
}
}
其中Singleton 通过private私有,避免了类在外部被实例化,只能通过getInstance方法去访问(java反射机制是能实例化构造方法为private的,会使java的所有单例失效)
但是懒汉式是线程不安全的,并发环境下很可能出现多个Singleton实例,要想使其安全有以下三种方式:
一,方法上加同步
public static synchronized Singleton getInstance(){
if(single==null){
single=new Singleton();
}
return single;
}
二,双重检查锁定
public static Singleton getInstance(){
if(singleton==null){
synchronized (Singleton.class){
if(singleton==null){
singleton=new Singleton();
}
}
}
return singleton;
}
三,建议第三种:静态内部类
public class Singleton(){
private static class LazyHolder{
private static final Singleton INSTANCE=new Singleton();
}
private Singleton(){
}
public static final Singleton getInstance(){
return LazyHolder.INSTANCE;
}
}
饿汉式:在类创建好时已经创建一个静态的方法供系统使用,并且不会改变,所以是线程安全的
public class Singleton{
private Singleton(){
}
private static final Singleton  single=new Singleton();
public static Singleton getInstance(){
return single;
}
}
区别:
饿汉式:类一旦加载就把单类初始化完成,在getInstance的时候,单例是已经存在的了,
              并且是线程安全的,可以直接用于多线程
               类创建的时候实例化一个静态对象,,不管使不使用,都会占用一定内存,但是第一次调用时速度会很快,因为内存资源已经初始化完成。
懒汉式: 只有调用时才会才回去初始化实例
               非线程安全的,所以上面有三种方式用于实现线程安全
               会延迟加载,第一次使用时才会实例化对象,第一次调用要初始化,如果工作量大的化性能上会有有延迟,但之后与饿汉式并无区别
 
线程安全:
如果进程中有多个线程在同时进行,而这些线程有可能会同时运行这段代码,如果每次运行结果和单线程的都是一致的,而且其他变量值与预期的相符,那就是线程安全的
posted @ 2016-08-23 13:17  夏沫秋至  阅读(117)  评论(0编辑  收藏  举报