单例设计模式(懒汉式)


单例设计模式
确保一个类只有一个对象
懒汉式 double checking
 1、构造器私有化,避免外部直接创建对象
 2、声明一个私有的静态变量
 3、创建一个对外的公共的静态方法 访问该变量,如果变量没有对象,创建该对象

 

SynDemo01.java

package cn.Thread02;
/*
 * 单例设计模式:确保一个类只有一个对象
 */
public class SynDemo01 {
    public static void main(String[] args) {
        JvmThread thread1=new JvmThread(100);
        JvmThread thread2=new JvmThread(500);
        thread1.start();
        thread2.start();
    }
}
class JvmThread extends Thread{
    private long time;
    public JvmThread() {
        
    }
    public JvmThread(long time) {
        this.time=time;
    }
    public void run() {
        System.out.println(Thread.currentThread().getName()+"-->创建    :"+Jvm.getInstance3(time));
    };
}
/*
 * 单例设计模式
 * 确保一个类只有一个对象
 * 懒汉式   double checking
 * 1、构造器私有化,避免外部直接创建对象
 * 2、声明一个私有的静态变量
 * 3、创建一个对外的公共的静态方法  访问该变量,如果变量没有对象,创建该对象
 */
class Jvm{
    //声明一个私有的静态变量
    private static Jvm instance =null;
    //构造器私有化 ,避免外部直接创建对象
    private Jvm(){
        
    }
    //创建一个对外的公共的静态方法  访问该变量,如果变量没有对象,创建该对象
    
    public static  Jvm getInstance3(long time) {     //同步块方式优化
        //c d e 看到有对象 就进不去了 直接返回  提高效率。
        if(null==instance) {
            //a,b
            synchronized(Jvm.class) {
                if(null==instance) {
                    try {
                        Thread.sleep(time);   //放大错误
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    instance=new Jvm();
                }
                
            }
        }
        return instance;
    }
    
    
    public static  Jvm getInstance2(long time) {     //同步块方式
        synchronized(Jvm.class) {
            if(null==instance) {
                try {
                    Thread.sleep(time);   //放大错误
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                instance=new Jvm();
            }
            return instance;
        }
    }
    
    
    public static synchronized Jvm getInstance(long time) {     //直接同步
        if(null==instance) {
            try {
                Thread.sleep(time);   //放大错误
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            instance=new Jvm();
        }
        return instance;
    }
    
    
    public static  Jvm getInstance1(long time) {     //没有同步,会出现不同的对象地址
        if(null==instance) {
            try {
                Thread.sleep(time);   //放大错误
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            instance=new Jvm();
        }
        return instance;
    }
}

 

posted on 2019-07-27 10:28  Mentality  阅读(581)  评论(0编辑  收藏  举报