含义:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。
优点:减少系统开销
实现方式:1.饿汉式
2.懒汉式
3.双重检测锁式
4.静态内部类式
5.枚举单例
饿汉式:
package pattern;
public class SingletonDemo01 {
private static SingletonDemo01 instance = new SingletonDemo01();
private SingletonDemo01()
{
}
public static SingletonDemo01 getinstance()
{
return instance;
}
}
可以看出这种方法,instance实例的创建是在jvm初始化这个类时产生的,是没有延时加载的
想一想别的类中能否实例化这个对象,显然是不能的,因为它的构造器是私有的。
懒汉式:
package pattern;
public class SingletonDemo02 {
private static SingletonDemo02 s;
private SingletonDemo02()
{
}
public static synchronized SingletonDemo02 getinstance()
{
if(s==null)
{
s= new SingletonDemo02();
}
return s;
}
}
这种懒汉式的方法虽然解决了延时加载的问题,但是会导致并发效率的降低,而且其实同步只需要第一次即可。
因为synchronized关键字的加入,使得不会同时有两个线程可以进入这个方法
双重检测锁式
package com.zw.mymaven;
public class SingletonDemo3 {
private volatile static SingletonDemo3 instance;
private SingletonDemo3() {
};
public static SingletonDemo3 getinstance() {
if (instance == null) {
synchronized (SingletonDemo3.class) {
if (instance == null) {
instance = new SingletonDemo3();
}
}
}
return instance;
}
}
静态内部类式
public class Singleton {
private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return LazyHolder.INSTANCE;
}
}
枚举单例请自行百度