一、定义
保证一个类仅有一个实例,并提供一个可以访问它的全局访问点。
二、单例目前分类
1.饿汉模式
很好理解,饿汉就是十分着急要吃的,也就是迫切的创建对象,程序一加载就创建好了对象,等着被使用。可以想象当程序一旦加载,会有着大量单例对象被创建,等待被使用,如果没有用到的话,将是一种资源的浪费,所以饿汉模式必须确定该对象会被使用。
2.懒汉模式
同理,懒汉则是当你使用的时候,才去创建对象来使用。即延时加载,保证了创建的对象必然会被使用到。
三、代码实例
保证多线程情况下只创建一个实例化对象。分别用饿汉式和懒汉式实现
懒汉式单例类:
public class LazySingleton { //volatile阻止进行写操作的时候,不会进行读操作 private static volatile LazySingleton instance; private LazySingleton() {} public static LazySingleton getInstance() { //防止多线程下,每次都加锁 if (instance == null) { synchronized (LazySingleton.class) { //防止多线程下创建多个实例 if (instance == null) { instance = new LazySingleton(); } } } return instance; } public void show() { System.out.println("懒汉式单例"); } }
饿汉式单例类:
public class HungrySingleton { //私有静态内部类 private static class SingletonHolder { private static final HungrySingleton INSTANCE = new HungrySingleton(); } private HungrySingleton() { } public static HungrySingleton getInstance() { /*SingletonHolder被加载的时机也就是在getInstance()方法第一次被调用的时候 避免了过早初始化,造成资源的浪费*/ return SingletonHolder.INSTANCE; } public void show() { System.out.println("饿汉式单例"); } }
测试类:
public class Test { public static void main(String[] args) { HungrySingleton instance = HungrySingleton.getInstance(); instance.show(); LazySingleton instance1 = LazySingleton.getInstance(); instance1.show(); } }