JAVA单例的几种形式以及其优缺点。
单例的定义:Singleton模式的用途,确保每个类只有一个实例,并提供全局的访问点。即为这个类只有一个实例,所有的访问必须通过这个唯一的实例来进行调用。
主要从三个方面评价相关性能:
①是否能够延迟加载/按需加载/懒加载类的实例
②是否是线程安全的
③性能的高低
主要分为两大类:懒汉式和饿汉式
一、懒汉式:

这是最基本的实现,但是在多线程并发可能会出现问题,不是唯一的实例。当两个不同的线程第一次同时访问这个getInstance方法时,而instance == null这个条件很可能同时成立,那么就会创建两个实例,两个线程会同时获得一个对象,那么此单例就毫无意义了。
优点:实现了延迟加载,应为首次静态只是声明了这个静态对象,并没有实例化,所以称为懒汉式。
缺点:很明显在多线程的时候无法保证线程的安全
改进方法:需要加入线程安全措施
二、饿汉式:

所谓饿汉式加载,就是提前创建了静态实例以备使用,提前将所有的都创建好了。
优点:线程安全,采用了类的加载方式,加载初始化静态变量,且只会被加载一次
缺点:无论是否使用都会创建该实例。
改进方法:需要加入懒汉式加载方法
三、懒汉线程安全加载:
优点:加入了线程同步锁之后,避免了多线程并发请求出现的多个实例的情况。懒加载,类初始化的时候不会加载实例。

缺点:同步性能很低,每次调用实例的时候都会调用synchorized同步
采用第二种即getInstance1(),同步只会在第一次创建实例时才同步,一旦创建成功,以后获取实例时就不需要同步了。
四、静态内部类(推荐使用)

优点:使用类的加载机制来保证线程安全,这个内部类和外部类没有关系,只有调用getInstance()的时候才会初始化。
网友评论