单例模式(Singleton pattern) 是一种常见的设计模式,常见的有两种写法:饿汉式单例、懒汉式单例。
单例模式定义
确保一个类只有一个实例,并提供一个全局访问点。
饿汉式单例
饿汉式单例,构造方法私有化,类加载的同时创建实例,代码如下:
1 public class MyClass { 2 3 private static MyClass instance = new MyClass(); 4 5 private MyClass() {} 6 7 public static MyClass getInstance() { 8 return instance; 9 } 10 11 // 测试 12 public static void main(String[] args) { 13 MyClass m1 = MyClass.getInstance(); 14 MyClass m2 = MyClass.getInstance(); 15 System.out.println(m1 == m2); 16 } 17 } 18 19 // 输出结果: 20 // true
懒汉式单例
懒汉式单例同样将构造方法私有化,只是在第一次调用类的时候才创建实例,代码:
1 public class MyClass { 2 3 private static MyClass instance; 4 5 private MyClass() {} 6 7 public static MyClass getInstance() { 8 if(instance == null) { 9 instance = new MyClass(); 10 } 11 return instance; 12 } 13 }
懒汉式单例有个问题,就是多线程并发访问时,可能会出错,创建出多个实例对象;当然,我可以用“synchronized”关键字修饰 getInstance方法,强制每个线程进入这个方法之前,要先等别的线程离开该方法,确保不出错;但是,这会降低性能,而且,只有第一次执行该方法时 才需要同步;所以在使用时,如果确实有高并发的情况,建议用饿汉式编写代码。也可以用双重检查加锁的方式,首先检查是不是已经创建了实例,如果未创建,再 进行同步。代码:
public class MyClass { private volatile static MyClass instance; private MyClass() {} public static MyClass getInstance() { if(instance == null) { synchronized (MyClass.class) { if(instance == null) { instance = new MyClass(); } } } return instance; } }