1 有些是出于内存消耗的考虑,比如类中数据量比较大的情况,或者说属性较多.
2:有些是为了不引起程序的混淆,必须保证类的实例只能有一份,比如框架的容器,就那spring容器来说,spring容器必须要是单例的,如果不是单例的,那么也就是说同一个数据在容器中存在着多份,会造成程序的复杂性提高;
实现的思路:1 构造函数私有化,将对象的创建权限保留在本类中(反射方式除外)2 在本类内部创建静态实例 3 给外部提供静态方法获取到该实例;
就实例的创建时机来将分为饿汉式和懒汉式.
饿汉式:就是指实例声明即初始化;这个最好理解;
懒汉式:就是延迟初始化,仅仅当获取的时候将实例进行初始化,这个在多线程环境下容易出现线程安全问题,需要有一定的同步机制进行防止;
主要有1 DCL,双重锁机制,用synchronized关键字对对象的初始化进行锁定,保证线程安全问题;
public class SingletonsByRWL {
基于原理:内部类的加载时机,是仅仅使用到的时候加载,因为内部类也有对应的字节码,内部类被使用到的时候jvm才会加载对应的内部类字节码;
public class Singleton {
private static Singleton instance;
private Singleton() {
}
private static class InnerSingleton {
public static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return InnerSingleton.INSTANCE;
}
}
在这里就是仅仅当你调用getInstance方法的时候才加载,并创建Singleton对象;从而做到了懒加载.同时线程安全问题不用考虑,jvm底层提供保证;
这是一种比较优雅的实现单实例的懒加载的方式;
ps:在反射的情况下,private修饰的构造函数可以被暴力反射,从而创建多个对象,如果你要避免这种情况,可以使用SecurityManager机制进行实现,
通常由应用服务器内部的配置实现;
<script type="text/javascript" id="wumiiRelatedItems"> </script>