-
什么是单例模式?
单例模式就是保证一个应用程序在整个声明周期内,只有一个实例对象。 -
单例模式的实现方式有哪些?
① 饿汉式
所谓饿汉式,就是在类使用的时候就已经创建好对象,即立即加载。常见的实现办法就是直接new一个对象。
优点:在多线程环境下是安全的。
缺点:没有调用方法之前就加载创建对象,会占用内存空间
② 懒汉式
所谓饿汉式,就是在使用的时候才调用getInstance()方法创建对象,即延时加载。
优点:只有调用getInstance()方法时才创建对象,不会占用内存。
缺点:在多线程环境下是不安全的。
解决方法有以下四种:
⑴ 将getInstance()方法声明为synchronized方法
特点:运行效率低下,下一个线程要想取得对象,必须等上一个线程释放锁之后,才可以继续执行。
⑵将⑴中的同步方法,改为同步代码块实现
特点:运行效率同样低
⑶ 针对重要代码进行单独同步
如:synchronized(类名.class){
实例=new 类名();
}
特点:效率大幅提高,但是,多线程环境下,还是无法解决同一个实例对象的结果
⑷使用DCL双检查锁机制
即用voltile声明实例对象,用synchronized对重要代码进行单独同步。这就是我们所谓双重检验锁方法。
特点:在多线程下推荐使用的方法。
③ 使用静态内部类实现单例模式
就是将创建对象的操作单独放在一个静态内部类中private static class myHander{
private static MyObject myobject=new MyObject();
}
特点:同样可以达到双重检验锁的效果。
但是,该方法遇到序列化对象时,就会得到多例结果。为了保证得到单例,需要在反序列化中使用readResolve()方法。
④ 使用static代码块实现单例模式public class MyObje{
private static MyObj instance=null;
private MyObj(){
}
static{
instance=new MyObj();
}
public static MyObj getInstance(){
return instance;
}
}
⑤使用enu枚举数据类型实现单例模式
单例模式与多线程
最新推荐文章于 2022-12-13 17:38:35 发布