单例模式
单例模式顾名思义就是只存在一个实例,在很多情况下我们不需要这个对象有多个实例,所以有了我们的单例模式。
这里只列举两种单例模式
线程安全的饿汉模式
/**
* 线程安全的饿汉模式
*/
public class Hungry {
public static Hungry hungry=new Hungry();
private Hungry(){}
public static final Hungry newInstance(){
return hungry;
}
}
懒汉模式
/**
* 懒汉模式(线程不安全)
*/
public class Lazy {
public static Lazy lazy=null;
private Lazy(){}
public static Lazy newInstance() {
if (lazy==null){
lazy=new Lazy();
}
return lazy;
}
}
懒汉模式如果需要线程安全那么需要加
synchronized
/**
* 懒汉模式(线程安全)
*/
public class LazyTwo {
public static LazyTwo lazy=null;
private LazyTwo(){}
public synchronized static LazyTwo newInstance() {
if (lazy==null){
lazy=new LazyTwo();
}
return lazy;
}
}
这里加锁对性能的影响是比较大的,可以考虑内部类去改进,这里不再演示
当单例遇到序列化的问题的时候,因为当对象实现了
Serializable
接口以后jvm会调用readResolve()方法所以我们需要这样写
/**
* 线程安全的饿汉模式
*/
public class Hungry implements Serializable {
public static Hungry hungry=new Hungry();
private Hungry(){}
public static final Hungry newInstance(){
return hungry;
}
/**
* 当实现Serializable接口后,序列化问题,反序列的时候jvm会调用这个方法,所以重新即可
* @return
*/
private Object readResolve(){
return hungry;
}
}
单例还有很多种写法,这里不再一一列举,只列举常见的2种普通的单例,我们需要了解的是这样的一个思想