第一种:懒汉模式
所有的单例模式都要有一个私有的静态的本类的对象,所以开头都会写private static 类名 对象;
然后还有一个就是都要有一个私有的的构造方法;是为了防止外部调用的时候进行初始化;这样就确保了只有在调用的时候;自己控制初始化;
接下来就要写一个公共的方法;里面要嵌套这个类的初始化的方式了;
public class Singleton { private static Singleton singleton; private Singleton() { } public static Singleton getInstance() { if (null == singleton) { synchronized (Singleton.class) { if (null == singleton) { singleton = new Singleton(); } } } return singleton; } }
所以现在来分析上面的单例模式,其他的两个方式都差不多相同,在这个初始化类的的时候,要进行判断是否有这个对象的存在,如果没有,加一个同步锁,以防止多线程的时候调用多个对象出来,然后在进行一次判断,是不是为空,为空就创建一个新的对象,并返回这个对象;
第二种;懒汉式;
public class TwoSingle { //静态内部类 //静态内部类特点:使用时候才加载;即只有第一次使用时候才会加载 //此种方法既实现了线程安全;又避免了同步带来的性能影响 private static class LazyHolder { private static final TwoSingle INSTANCE = new TwoSingle(); } private TwoSingle() { } public static TwoSingle getIntanstance() { return LazyHolder.INSTANCE; } }这个懒汉式的写法,是李永乐静态内部类的特点;使用的时候才架子啊;即只有第一次使用的时候才会加载
这样既可以实现线程安全;有避免了同步带来的性能的影响
第三种:饿汉式
public class Single { //恶汉模式与懒汉模式对比; //线程安全方面; //恶汉模式天生就是线程安全;可以直接用于多线程而不会出现问题 //懒汉模式本事是非线程安全的 ;为了实现线程安全才会出现前面的几种方式 //资源加载和性能; //恶汉在类创建的同事就实例化一个静态对象出来;不管以后是佛会使用这个单利;都会占据一定的内存; //但是这样速度就快了 //懒汉式会延迟加载;在第一次使用该单利的时候才会实例化对象出来 //第一次调用时要做初始化;如要做的工作比较多,性能上还有延迟 private static final Single INSTANCE = new Single(); private Single() { } public static Single getInstance() { return INSTANCE; } }这种写法,代码显得更简单;性能上更快,因为在这个类创建的时候就已经调用存在了,