单例模式有一下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
它到底能带给我们什么好处呢?其实无非是三个方面的作用:
1、控制资源的使用,通过线程同步来控制资源的并发访问。
2、控制实例产生的数量,有利于Java垃圾回收(garbage collection:System.gc(); Runtime.getRuntime.gc();),达到节省内存的目的。
3、作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信。
懒汉式:对象延迟加载。
思路:类存在时内部没有对象,只有当调用方法时才会在类中建立对象(有多懒)。
然后这个是基本懒汉式的代码:
- class Single
- {
- private static Single s= null;
- private Single(){}
- public static Single getInstance()
- {
- if(s== null)
- s= new Single();
- return s;
- }
- }
下面是安全的懒汉式代码:
- class Single
- {
- private static Single s= null;
- private Single(){}
- public static Single getInstance()
- {
- if(s== null)
- {
- synchronized(Single.class)
- {
- if(s== null)
- {
- s= new Single();
- }
- }
- }
- return s;
- }
- }
饿汉式:
public class Singleton {
/**jvm保证instance只被初始化一次*/
private static final Singleton instance = new Singleton();
/**阻止外部使用new实例化对象*/
private Singleton(){
}
}区别:
饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变
懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的