-
概念
单例模式:单例模式核心只需要new一个实例对象的模式,比如数据库连接,在线人数等,一些网站上看到的在线人数统计就是通过单例模式实现的,把一个计时器存放在数据库或者内存中,当有人登陆的时候取出来加一再放回去,有人退出登陆的时候取出来减一再放回去,但是当有两个人同时登陆的时候,会同时取出计数器,同时加一,同时放回去,这样的话数据就会错误,所以需要一个全局变量的对象给全部人使用,只需要new出一个实例对象,这就是单例模式的应用,并且单例模式节省资源,因为它控制了实例对象的个数,并有利于gc回收。 -
实现代码
懒汉式方式
public class Singleton{
private Singleton(){}
private static Singleton singleton = null; //不建立对象
public static synchronized Singleton getInstance(){
if(singleton == null) { //先判断是否为空
singleton = new Singleton (); //懒汉式做法
}
return singleton ;
}
}
饿汉式方式
public class Singleton{
public Singleton(){}
private static Singleton singleton = new Singleton(); //建立对象
public static Singleton getInstance(){
return singleton ;//直接返回单例对象
}
}
-
缺点
懒汉式方式在多线程中存在安全问题,如果多线程同时请求创建对象,可能会创建出多个对象,若加上同步锁又会影响性能。而饿汉式方式对于创建单例对象很慢时,那么在jvm加载类时,如果其他地方使用到这个对象,那么就会初始化这个单例变量,可能会花费很多时间。 -
使用内部静态类优化单例模式
public class StaticInnerSingleton {
private StaticInnerSingleton() {
if (SingletonHolder.instance != null) {
throw new IllegalStateException();
}
}
private static class SingletonHolder {
private static StaticInnerSingleton instance = new StaticInnerSingleton();
}
public static StaticInnerSingleton getInstance() {
return SingletonHolder.instance;
}
}
网友评论