单例模式是1种对象创建型模式,使用单例模式,可以保证为1个类只生成唯1的实例对象。也就是说,在全部程序空间中,该类只存在1个实例对象。
即保证1个类、只有1个实例存在,同时提供1个全局唯1访问这个类的访问点。
单例模式类图:
在利用系统开发中,我们常常有以下需求:
-在多个线程之间,比如servlet环境,同享同1个资源或操作同1个对象
-在全部程序空间使用全局变量,同享资源
-大范围系统中,为了性能的斟酌,需要节省对象的创建时间等等。
由于Singleton模式可以保证为1个类只生成唯1的实例对象,所以这些情况,Singleton模式就派上用处了。
单例模式的实现有:懒汉式、饿汉式和两重检查。懒汉式调用顺序:
饿汉式调用顺序图:
懒汉式是典型的时间换空间,饿汉式是典型的空间换时间。
不加同步的懒汉式是线程不安全的,实现懒汉式线程安全只需加synhronized便可。
饿汉式是线程安全的,由于虚拟机保证了只会装载1次。
“两重检查”就是在getInstance()中减少使用同步。
第1重检查:其实不是每次进入getInstace方法都要同步,而是先不同步,进入方法 后,先检查实例是不是存在,不存在才进入下面的同步块。
第2重检查:进入同步块只会再次检查实例是不是存在,不存在就在同步的情况下创建1个实例这是第2重检查。
这样只需同步1次,从而减少了屡次同步情况下进行判断所浪费的时间。
单例模式的本质是控制实例数目,当需要控制1个类的实例只能有1个,而且客户只能从1个全局访问点访问它时可以选用单例模式。